iter_swap(std::common_iterator)
From cppreference.com
< cpp | iterator | common iterator
| template< std::indirectly_swappable<I> I2, class S2 > friend constexpr void |
(C++20以降) | |
2つの基底イテレータが指すオブジェクトを交換します。`x`が`I`オブジェクトを保持しておらず、`y`が`I2`オブジェクトを保持していない場合(つまり、`x`と`y`の少なくとも一方がイテレータを保持していない場合)は、未定義の動作となります。
関数本体は、`std::get<I>(x.var)`と`std::get<I2>(y.var)`の`ranges::iter_swap`に相当します。
この関数テンプレートは、通常の修飾なしlookupまたは修飾ありlookupからは見えず、`std::common_iterator<I,S>`が引数の関連クラスである場合にのみ、引数依存lookupによって見つけることができます。
目次 |
[編集] パラメータ
| x, y | - | 交換する要素へのイテレータ |
[編集] 戻り値
(なし)
[編集] 計算量
定数。
[編集] 例外
noexcept 指定:
noexcept(noexcept(ranges::iter_swap(std::declval<const I&>(), std::declval<const I2&>())))
[編集] 例
このコードを実行
#include <algorithm> #include <iostream> #include <iterator> #include <string> #include <vector> int main() { std::vector<std::string> v1{"1", "2", "3", "4", "5"}, v2{"α", "β", "γ", "δ", "ε"}; using CI = std::common_iterator< std::counted_iterator<std::vector<std::string>::iterator>, std::default_sentinel_t >; CI first1{std::counted_iterator{v1.begin(), 3}}; CI first2{std::counted_iterator{v2.begin(), 4}}; CI last{std::default_sentinel}; auto print = [&](auto rem) { std::cout << rem << "v1 = "; std::ranges::copy(v1, std::ostream_iterator<std::string>{std::cout, " "}); std::cout << "\nv2 = "; std::ranges::copy(v2, std::ostream_iterator<std::string>{std::cout, " "}); std::cout << '\n'; }; print("Before iter_swap:\n"); for (; first1 != last && first2 != last; ++first1, ++first2) iter_swap(first1, first2); // ADL print("After iter_swap:\n"); }
出力
Before iter_swap: v1 = 1 2 3 4 5 v2 = α β γ δ ε After iter_swap: v1 = α β γ 4 5 v2 = 1 2 3 δ ε
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3574 | C++20 | variant は完全にconstexprでしたが(P2231R1)、 common_iterator はそうではありませんでした。 |
constexpr にもなりました。 |
[編集] 関連項目
| 2つのオブジェクトの値を交換する (関数テンプレート) | |
| 2つの要素の範囲を交換する (関数テンプレート) | |
| 2つのイテレータが指す要素をスワップする (関数テンプレート) | |
| (C++20) |
2つの間接参照可能なオブジェクトが参照する値を交換する (カスタマイゼーションポイントオブジェクト) |
| (C++20) |
2つの基底イテレータが指すオブジェクトをスワップする (関数テンプレート) |