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