#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, что отключает поиск пользовательских функций.
Комментариев нет:
Отправить комментарий