Spec-Zone.ru › C++

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)
1) Меняет местами элементы двух диапазонов [first1, last1) и [first2, std::next(first2, std::distance(first1, next1))).
2) То же, что и (1), но выполняется согласно policy.
Эта перегрузка участвует в разрешении перегрузки, только если значение следующего выражения равно true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(до C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(начиная с 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

См. также

ranges::swap_ranges
(C++20)
меняет местами элементы двух диапазонов
(объект-функция алгоритма)
iter_swap
меняет местами элементы, на которые указывают два итератора
(шаблон функции)
swap
меняет местами значения двух объектов
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/swap_ranges

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API