std::swap_ranges
| Определён в заголовке <algorithm>
|
||
template< class ForwardIt1, class ForwardIt2 >
ForwardIt2 swap_ranges( ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2 );
|
(1) | (constexpr начиная с C++20) |
template< class ExecutionPolicy,
class ForwardIt1, class ForwardIt2 >
ForwardIt2 swap_ranges( ExecutionPolicy&& policy,
ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2 );
|
(2) | (начиная с C++17) |
[first1, last1) и другим диапазоном из std::distance(first1, last1) элементов, начинающимся с first2.policy.true:|
|
(до C++20) |
|
|
(начиная с C++20) |
Если выполняется любое из следующих условий, поведение не определено:
- Два диапазона перекрываются.
- Существует пара соответствующих итераторов
iter1иiter2в двух диапазонах такая, что*iter1не является Swappable с*iter2.
Параметры
| first1, last1 | - | пара итераторов, определяющих диапазон элементов для обмена |
| first2 | - | начало второго диапазона элементов для обмена |
| policy | - | политика выполнения для использования |
| Требования к типам | ||
-
ForwardIt1, ForwardIt2
должны соответствовать требованиям
LegacyForwardIterator
.
|
||
Возвращаемое значение
Итератор на элемент, следующий за последним элементом, обмененным в диапазоне, начинающемся с first2 .
Сложность
Ровно std:: distance ( first1, last1 ) обменов.
Исключения
Перегрузка с параметром шаблона с именем
ExecutionPolicy
сообщает об ошибках следующим образом:
-
Если выполнение функции, вызванной как часть алгоритма, выбрасывает исключение и
ExecutionPolicyявляется одним из стандартных политик , std::terminate вызывается. Для любой другойExecutionPolicyповедение определяется реализацией. - Если алгоритму не удается выделить память, std::bad_alloc выбрасывается.
Примечания
Реализации (например,
MSVC STL
) могут использовать векторизацию, когда тип итератора удовлетворяет требованиям
LegacyContiguousIterator
и обмен его типа значений не вызывает ни нетривиальные специальные функции-члены, ни
ADL
-найденную функцию
swap
.
Возможная реализация
template<class ForwardIt1, class ForwardIt2> constexpr //< since C++20 ForwardIt2 swap_ranges(ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2) { for (; first1 != last1; ++first1, ++first2) std::iter_swap(first1, first2); return first2; } |
` и `` оставлен без изменений, как и требовалось. HTML-теги и атрибуты также сохранены в оригинальном виде.
Пример
Демонстрирует обмен поддиапазонами из разных контейнеров.
#include <algorithm> #include <iostream> #include <list> #include <vector> auto print = [](auto comment, auto const& seq) { std::cout << comment; for (const auto& e : seq) std::cout << e << ' '; std::cout << '\n'; }; int main() { std::vector<char> v{'a', 'b', 'c', 'd', 'e'}; std::list<char> l{'1', '2', '3', '4', '5'}; print("Before swap_ranges:\n" "v: ", v); print("l: ", l); std::swap_ranges(v.begin(), v.begin() + 3, l.begin()); print("After swap_ranges:\n" "v: ", v); print("l: ", l); }
Вывод:
Before swap_ranges: v: a b c d e l: 1 2 3 4 5 After swap_ranges: v: 1 2 3 d e l: a b c 4 5
Смотрите также
|
обменивает элементы, на которые указывают два итератора
(шаблон функции) |
|
|
обменивает значения двух объектов
(шаблон функции) |
|
|
(C++20)
|
обменивает два диапазона элементов
(функциональный объект алгоритма) |