std::swap_ranges
來自 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 起) |
如果滿足以下任何條件,則行為是未定義的:
- 兩個範圍重疊。
- 兩個範圍中存在一對對應的迭代器 iter1 和 iter2,使得 *iter1 不能與 *iter2 交換。
目錄 |
[編輯] 引數
first1, last1 | - | 定義要交換元素的範圍的迭代器對 |
first2 | - | 第二個要交換的元素範圍的開始 |
policy | - | 要使用的 執行策略 |
型別要求 | ||
-ForwardIt1, ForwardIt2 必須滿足 LegacyForwardIterator 的要求。 |
[編輯] 返回值
指向以 first2 開始的範圍中,在最後一個交換元素之後的元素的迭代器。
[編輯] 複雜度
恰好 std::distance(first1, last1) 次交換。
[編輯] 異常
帶有名為 ExecutionPolicy
的模板引數的過載會按如下方式報告錯誤:
- 如果作為演算法一部分呼叫的函式丟擲異常,並且
ExecutionPolicy
是標準策略之一,則呼叫 std::terminate。對於任何其他ExecutionPolicy
,行為由實現定義。 - 如果演算法未能分配記憶體,則丟擲 std::bad_alloc。
[編輯] 注意
當迭代器型別滿足 LegacyContiguousIterator 並且其值型別的交換不呼叫非平凡的特殊成員函式或透過 ADL 找到的 swap
時,實現(例如 MSVC STL)可能會啟用向量化。
[編輯] 可能的實現
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
[編輯] 參閱
交換兩個迭代器所指向的元素 (函式模板) | |
交換兩個物件的值 (函式模板) | |
(C++20) |
交換兩個範圍的元素 (演算法函式物件) |