Пространства имён
Варианты
Действия

std::swap_ranges

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Политики исполнения (C++17)
Немодифицирующие операции над последовательностями
(C++11)(C++11)(C++11)
(C++17)
Модифицирующие операции над последовательностями
Операции разбиения
Операции сортировки
(C++11)
Операции двоичного поиска
Операции с наборами (в отсортированных диапазонах)
Операции с кучей
(C++11)
Операций минимума/максимума
(C++11)
(C++17)

Операции перестановки
Числовые операции
Операции с неинициализированной памятью
(C++17)
(C++17)
(C++17)
Библиотека C
 
Определено в заголовочном файле <algorithm>
template< class ForwardIt1, class ForwardIt2 >
ForwardIt2 swap_ranges( ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2 )

Обмен элементов между диапазоном [first1last1) и другим диапазоном, который начинается с first2. Количество элементов в этих двух диапазонах должно совпадать.

Содержание

[править] Параметры

[first1last1) два итератора задающих диапазон элементов для обмена
first2 начало второго диапазона для обмена
Требования к типам
-
ForwardIt1, ForwardIt2 должен соответствовать требованиям ForwardIterator.
-
Тип после разыменовывания ForwardIt1 и ForwardIt2 должен удовлетворять требованиям Swappable

[править] Возвращаемое значение

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

[править] Возможная реализация

template<class ForwardIt1, class ForwardIt2>
ForwardIt1 swap_ranges(ForwardIt1 first1,
                             ForwardIt1 last1,
                             ForwardIt2 first2)
{
    while (first1 != last1) {
        std::iter_swap(first1++, first2++);
    }
    return first2;
}

[править] Пример

Демонстрирует обмен поддиапазонов из разных контейнеров

#include <algorithm>
#include <list>
#include <vector>
#include <iostream>
int main()
{
    std::vector<int> v = {1, 2, 3, 4, 5};
    std::list<int> l = {-1, -2, -3, -4, -5};
 
    std::swap_ranges(v.begin(), v.begin() + 3, l.begin());
 
    for(int n : v)
       std::cout << n << ' ';
    std::cout << '\n';
    for(int n : l)
       std::cout << n << ' ';
    std::cout << '\n';
}

Вывод:

-1 -2 -3 4 5
1 2 3 -4 -5

[править] Сложность

Линейная от расстояния между first и last

[править] См. также

меняет местами элементы, на которые указывают два итератора
(шаблон функции) [править]
меняет местами значения двух объектов
(шаблон функции) [править]