std::swap_ranges
From cppreference.com
| ヘッダー <algorithm> で定義 |
||
| template< class ForwardIt1, class ForwardIt2 > ForwardIt2 swap_ranges( ForwardIt1 first1, ForwardIt1 last1, |
(1) | (C++20 以降 constexpr) |
| template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 > |
(2) | (C++17以降) |
2) (1) と同じですが、policy に従って実行されます。
このオーバーロードは、以下のすべての条件が満たされた場合にのみオーバーロード解決に参加します。
|
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 と *iter2 が 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つのイテレータが指す要素をスワップする (関数テンプレート) | |
| 2つのオブジェクトの値を交換する (関数テンプレート) | |
| (C++20) |
2つの要素の範囲を交換する (アルゴリズム関数オブジェクト) |