std::swap_ranges
| ヘッダ <algorithm>
|
||
template< class ForwardIt1, class ForwardIt2 >
ForwardIt2 swap_ranges( ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2 );
|
で定義 (1) | (C++20 から constexpr) |
template< class ExecutionPolicy,
class ForwardIt1, class ForwardIt2 >
ForwardIt2 swap_ranges( ExecutionPolicy&& policy,
ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2 );
|
(2) | (C++17 から) |
[first1, last1) と、std::distance(first1, last1) 個の要素を持つ別の範囲(先頭は first2)との間で要素を交換します。policy に従って実行されます。true である場合にのみオーバーロード解決に参加します。
|
|
(C++20 まで) |
|
|
(C++20 から) |
以下の条件のいずれかが満たされる場合、動作は未定義です。
- 2つの範囲が重なる場合。
- 2つの範囲内に、対応するイテレータのペア
iter1とiter2が存在し、*iter1が Swappable と*iter2の間でない場合。
パラメータ
| first1, last1 | - | 交換する要素の 範囲 を定義するイテレータのペア |
| first2 | - | 交換する2番目の要素範囲の先頭 |
| policy | - | 使用する 実行ポリシー |
| 型要件 | ||
-
ForwardIt1, ForwardIt2
は
LegacyForwardIterator
の要件を満たさなければならない
|
||
戻り値
範囲の先頭 first2 で交換された最後の要素の次を指すイテレータ。
計算量
正確に std:: distance ( first1, last1 ) 回のスワップを行います。
例外
テンプレートパラメータExecutionPolicyを持つオーバーロードは、
以下のようにエラーを報告します:
-
アルゴリズムの一部として呼び出された関数の実行が例外をスローした場合、
ExecutionPolicyが 標準ポリシー のいずれかであるとき、 std::terminate が呼び出される。それ以外のExecutionPolicyについては、動作は実装定義である。 - アルゴリズムがメモリの確保に失敗した場合、 std::bad_alloc がスローされる。
注記
実装(例:
MSVC STL
)は、イテレータ型が
LegacyContiguousIterator
を満たし、その値型の交換が非自明な特殊メンバ関数も
ADL
で見つかった
swap
も呼び出さない場合、ベクトル化を有効化することがあります。
実装例
template<class ForwardIt1, class ForwardIt2> constexpr //< since C++20 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
関連項目
|
2つのイテレータが指す要素を交換する
(function template) |
|
|
2つのオブジェクトの値を交換する
(function template) |
|
|
(C++20)
|
2つの範囲の要素を交換する
(algorithm function object) |