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