Страницы

Поиск по вопросам

пятница, 13 марта 2020 г.

Зачем нужна функция std::iter_swap?

#cpp


В стандартной библиотеке есть функция std::iter_swap.

Зачем она нужна, если можно самому написать

using std::swap; swap(*a, *b);

    


Ответы

Ответ 1



Во-первых, эта функция выполняет такую же роль, как и std::next, она гарантирует, что операция разыменования итератора производится для lvalue, а не rvalue. Стандарт требует что для переменной-итератора i можно написать *i, однако он не требует что можно написать *f(), поэтому следующий код может не скомпилироваться (или работать не так), если итератор не поддерживает разыменование rvalue: swap(*first, *std::max_element(std::next(first), last)); // ПЛОХО, может не работать Во-вторых, для того чтобы была возможность использовать пользовательские реализации функции swap, вместо std::swap(*a, *b) надо писать using std::swap; swap(*a, *b); что выглядит несколько длинно, и об этом легко забыть. Также, теоретически std::iter_swap может быть перегружена для итераторов связанных списков, так что вместо обмена самих элементов списка, меняются только связи на его элементы. Впрочем алгоритмы стандартной библиотеки вызывают std::iter_swap, что отключает поиск пользовательских функций.

Комментариев нет:

Отправить комментарий