iter_swap(std::common_iterator)
來自 cppreference.com
< cpp | 迭代器 | common_iterator
template< std::indirectly_swappable<I> I2, class S2 > friend constexpr void |
(C++20 起) | |
交換兩個底層迭代器所指向的物件。如果 x 不持有 I
物件或 y 不持有 I2
物件(即 x 和 y 至少有一個不持有迭代器),則行為未定義。
函式體等價於 ranges::iter_swap(std::get<I>(x.var), std::get<I2>(y.var))。
此函式模板對常規非限定或限定查詢不可見,只能通過當 std::common_iterator<I,S> 是引數的關聯類時,實參依賴查詢才能找到。
目錄 |
[編輯] 引數
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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 3574 | C++20 | variant 完全為 constexpr (P2231R1) 但 common_iterator 不是 |
也設為 constexpr |
[編輯] 亦可見
交換兩個物件的值 (函式模板) | |
交換兩個範圍的元素 (函式模板) | |
交換兩個迭代器所指向的元素 (函式模板) | |
(C++20) |
交換兩個可解引用物件所引用的值 (定製點物件) |
(C++20) |
交換兩個底層迭代器指向的物件 (函式模板) |