std:: swap_ranges
|
定義先ヘッダ
<algorithm>
|
||
|
template
<
class
ForwardIt1,
class
ForwardIt2
>
ForwardIt2 swap_ranges
(
ForwardIt1 first1, ForwardIt1 last1,
|
(1) | (constexpr since C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2
>
|
(2) | (since C++17) |
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> が true であること。 |
(C++20まで) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> が true であること。 |
(C++20以降) |
以下のいずれかの条件が満たされる場合、動作は未定義です:
- 2つの範囲が重複している。
- 2つの範囲に対応するイテレータ iter1 と iter2 が存在し、 * iter1 が Swappable でない場合。
目次 |
パラメータ
| 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) |