@specsoftdev live:.cid.8e17e9b93cabb607 specsoftdev@gmail.com
std::ranges::swap_ranges
Актуально для C++26.

#include <algorithm>
Актуально на 2025-07-09.


Define overload #1
template<input_iterator I1, sentinel_for<I1> S1,
         input_iterator I2, sentinel_for<I2> S2>
requires indirectly_swappable<I1, I2>
constexpr ranges::swap_ranges_result<I1, I2>
    swap_ranges(I1 first1, S1 last1, I2 first2, S2 last2);

Обменивает элементы между диапазонами [first1, last1] и [first2, last2].
Стандарт требует чтобы диапазоны [first1, last1] и [first2, last2] не перекрывались.
Example, possible implementation
Define overload #2
template<input_range R1, input_range R2>
requires indirectly_swappable<iterator_t<R1>, iterator_t<R2>>
constexpr ranges::swap_ranges_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>>
    swap_ranges(R1&& r1, R2&& r2);

Обменивает элементы между диапазонами r1 и r2.
Example, possible implementation

Параметры

first1, last1 - пара iterator-sentinel указывающих на первый обмениваемый диапазон.
first2, last2 - пара iterator-sentinel указывающих на второй обмениваемый диапазон.
r1, r2 - обмениваемые диапазоны.



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

Вернёт пару итераторов {first1 + M , first2 + M}, где M наименьшее число элементов в одном из диапазонов (M = min(last1 - first1, last2 - first2)).
Во избежание возврата из функции итератора ссылающегося на временный объект, будет возвращен объект std::ranges::dangling, если тип r1 или r2 не удовлетворяет требования концепта ranges::borrowed_range.




Examples


Example 1:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
namespace ranges = std::ranges;

int main()
{
    std::vector<int> in1{1, 3, 5, 7};
    std::vector<int> in2{2, 4, 6};
    auto res = ranges::swap_ranges(in1, in2);

    for (auto i : in1)
        std::cout << i << ' ';
    std::cout << std::endl;

    for (auto i : in2)
        std::cout << i << ' ';
    std::cout << std::endl;

    std::cout << *res.in1 << std::endl;
}



2 4 6 7
1 3 5
7





Changelog

C++20
Введён в стандарт.


See also

TODO

This page was last modified on 2025-07-09