Spec-Zone.ru › C++

std::swap_ranges

Определено в заголовке <algorithm>
(1)
template< class ForwardIt1, class ForwardIt2 >
ForwardIt2 swap_ranges( ForwardIt1 first1, ForwardIt1 last1,
                        ForwardIt2 first2 );
(до C++20)
template< class ForwardIt1, class ForwardIt2 >
constexpr ForwardIt2 swap_ranges( ForwardIt1 first1, ForwardIt1 last1,
                                  ForwardIt2 first2 );
(с 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.
Предварительное условие: два диапазона [first1, last1) и [first2, last2) не перекрываются, где last2 = std::next(first2, std::distance(first1, last1)).
2) То же, что и (1), но выполняется в соответствии с policy. Эта перегрузка не участвует в разрешении перегрузки, если

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> является true.

(до C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> является true.

(с C++20)

Параметры

first1, last1 - первый диапазон элементов для обмена
first2 - начало второго диапазона элементов для обмена
policy - используемая стратегия выполнения. Подробности см. в стратегии выполнения.
Требования к типу
-ForwardIt1, ForwardIt2 должно удовлетворять требованиям LegacyForwardIterator.
-Типы, полученные при разыменовании ForwardIt1 и ForwardIt2 должны удовлетворять требованиям Swappable.

Возвращаемое значение

Итератор на элемент после последнего обмениваемого элемента в диапазоне, начинающемся с first2.

Сложность

Линейна по расстоянию между first1 и last1.

Исключения

Перегрузка с параметром шаблона ExecutionPolicy сообщает об ошибках следующим образом:

  • Если при выполнении функции, вызываемой как часть алгоритма, выбрасывается исключение, а ExecutionPolicy является одной из стандартных стратегий, вызывается std::terminate. Для любой другой ExecutionPolicy, поведение определяется реализацией.
  • Если алгоритм не может выделить память, выбрасывается std::bad_alloc.

Примечания

Реализации (например, MSVC STL) могут использовать векторизацию, когда тип итератора удовлетворяет LegacyContiguousIterator, а обмен его типом значения не вызывает ни одну из нетривиальных специальных функций-членов, ни найденную через ADL swap.

Возможная реализация

template<class ForwardIt1, class ForwardIt2>
constexpr 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, 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

См. также

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

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

Spec-Zone.ru

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