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) и [first2, std::next(first2, std::distance(first1, next1))).policy.true: |
| (до C++20) |
|
| (начиная с C++20) |
Поведение не определено, если выполняется любое из следующих условий:
- Два диапазона перекрываются.
- В двух диапазонах существует пара соответствующих итераторов
iter1иiter2, для которой*iter1не является взаимозаменяемым с*iter2.
Параметры
| first1, last1 | - | пара итераторов, задающих первый диапазон |
| first2 | - | начало второго диапазона |
| policy | - | используемая политика выполнения |
| Требования к типам | ||
-ForwardIt1, ForwardIt2 должен соответствовать требованиям LegacyForwardIterator. |
||
Возвращаемое значение
Итератор за последним элементом второго диапазона.
Сложность
Ровно std::distance(first1, last1) операций обмена.
Исключения
2) В ходе выполнения:- Если необходимые для распараллеливания временные ресурсы памяти недоступны, генерируется исключение
std::bad_alloc. - Если при доступе к объектам через аргумент алгоритма возникает необработанное исключение, поведение определяется политикой выполнения (для стандартных политик вызывается
std::terminate).
Примечания
Реализации (например, MSVC STL) могут включать векторизацию, если тип итератора удовлетворяет требованиям LegacyContiguousIterator, а обмен значениями его типа не вызывает ни одной нетривиальной специальной функции-члена или функции swap, найденной посредством ADL.
Возможная реализация
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;
}
|
Пример
Демонстрируется обмен элементами поддиапазонов из разных контейнеров.
#include <algorithm>
#include <iostream>
#include <list>
#include <vector>
auto print = [](auto comment, const auto& 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) | меняет местами элементы двух диапазонов (объект-функция алгоритма) |
| меняет местами элементы, на которые указывают два итератора (шаблон функции) |
|
| меняет местами значения двух объектов (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/swap_ranges