Namespaces
Variants

std::swap_ranges

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとレンジのアルゴリズム (C++20)
制約付きアルゴリズム(例:ranges::copy, ranges::sort, ...)
変更を加えないシーケンス操作    
一括操作
(C++17)
検索操作
変更を加えるシーケンス操作
コピー操作
(C++11)
(C++11)
スワップ操作
変換操作
生成操作
除去操作
順序変更操作
(C++17まで)(C++11)
(C++20)(C++20)
サンプリング操作
(C++17)

ソートおよび関連操作
分割操作
(C++11)    

ソート操作
二分探索操作
(分割された範囲に対して)
集合操作(ソート済み範囲に対して)
マージ操作(ソート済み範囲に対して)
ヒープ操作
最小値/最大値操作
(C++11)
(C++17)
辞書順比較操作
順列操作


 
ヘッダ <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 から)
1) 範囲 [first1, last1) と、std::distance(first1, last1) 個の要素を持つ別の範囲(先頭は first2)との間で要素を交換します。
2) (1) と同じですが、policy に従って実行されます。
このオーバーロードは、次の式の値が true である場合にのみオーバーロード解決に参加します。

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(C++20 まで)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(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;
}
HTMLタグ、属性、``、`
`、``タグ内のテキスト、およびC++固有の用語は翻訳せず、元のフォーマットを保持しました。

例

異なるコンテナからのサブレンジの交換を実演します。

#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)
2つの範囲の要素を交換する
(algorithm function object)