跳到主要内容

std::swap_ranges() 算法

// (1)
template< class ForwardIt1, class ForwardIt2 >
constexpr ForwardIt2 swap_ranges( ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2 );

// (2)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt2 swap_ranges( ExecutionPolicy&& policy,
ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2 );
  • (1) 交换范围 [first1; last1) 和另一个从 first2 开始的范围中的元素。

    前置条件:两个范围 [first1; last1) 和 [first2; last2) 不重叠,其中 last2 = std::next(first2, std::distance(first1, last1))

  • (2)(1) 相同,但根据 policy 执行。

    重载决议

    这些重载只有在 std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>  (C++20 之前) std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>  (C++20 起)true 时才参与重载决议。

参数

first1
last1

要交换的第一个范围。

first2

要交换的第二个范围的起始。

policy

要使用的执行策略。有关详细信息,请参阅执行策略

类型要求

ForwardIt1
ForwardIt2
LegacyForwardIterator

ForwardIt1ForwardIt2 解引用后的类型必须满足 Swappable 的要求。

返回值

指向以 first2 开始的范围内交换的最后一个元素之后的元素的迭代器。

复杂度

first1last1 之间的距离呈线性关系。

异常

带有模板参数 ExecutionPolicy 的重载报告错误如下

  • 如果作为算法一部分调用的函数抛出异常,并且 ExecutionPolicy标准策略之一,则调用 std::terminate。对于任何其他 ExecutionPolicy,行为是实现定义的.
  • 如果算法未能分配内存,则抛出 std::bad_alloc

可能的实现

swap_ranges (1)

template<class ForwardIt1, class ForwardIt2>
constexpr ForwardIt2 swap_ranges(ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2)
{
for (; first1 != last1; ++first1, ++first2)
std::iter_swap(first1, first2);

return first2;
}

备注

当迭代器类型满足 LegacyContiguousIterator 并且交换其值类型不调用非平凡的特殊成员函数或 ADL 找到的 swap 时,实现(例如 MSVC STL)可以启用向量化。

示例

Main.cpp
#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
本文来源于此 CppReference 页面。它可能为了改进或编辑者的偏好而进行了修改。点击“编辑此页面”查看本文档的所有更改。
悬停查看原始许可证。

std::swap_ranges() 算法

// (1)
template< class ForwardIt1, class ForwardIt2 >
constexpr ForwardIt2 swap_ranges( ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2 );

// (2)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt2 swap_ranges( ExecutionPolicy&& policy,
ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2 );
  • (1) 交换范围 [first1; last1) 和另一个从 first2 开始的范围中的元素。

    前置条件:两个范围 [first1; last1) 和 [first2; last2) 不重叠,其中 last2 = std::next(first2, std::distance(first1, last1))

  • (2)(1) 相同,但根据 policy 执行。

    重载决议

    这些重载只有在 std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>  (C++20 之前) std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>  (C++20 起)true 时才参与重载决议。

参数

first1
last1

要交换的第一个范围。

first2

要交换的第二个范围的起始。

policy

要使用的执行策略。有关详细信息,请参阅执行策略

类型要求

ForwardIt1
ForwardIt2
LegacyForwardIterator

ForwardIt1ForwardIt2 解引用后的类型必须满足 Swappable 的要求。

返回值

指向以 first2 开始的范围内交换的最后一个元素之后的元素的迭代器。

复杂度

first1last1 之间的距离呈线性关系。

异常

带有模板参数 ExecutionPolicy 的重载报告错误如下

  • 如果作为算法一部分调用的函数抛出异常,并且 ExecutionPolicy标准策略之一,则调用 std::terminate。对于任何其他 ExecutionPolicy,行为是实现定义的.
  • 如果算法未能分配内存,则抛出 std::bad_alloc

可能的实现

swap_ranges (1)

template<class ForwardIt1, class ForwardIt2>
constexpr ForwardIt2 swap_ranges(ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2)
{
for (; first1 != last1; ++first1, ++first2)
std::iter_swap(first1, first2);

return first2;
}

备注

当迭代器类型满足 LegacyContiguousIterator 并且交换其值类型不调用非平凡的特殊成员函数或 ADL 找到的 swap 时,实现(例如 MSVC STL)可以启用向量化。

示例

Main.cpp
#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
本文来源于此 CppReference 页面。它可能为了改进或编辑者的偏好而进行了修改。点击“编辑此页面”查看本文档的所有更改。
悬停查看原始许可证。