std::rotate_copy() 算法
- 自 C++20 起
- 自 C++17 起
- C++17 之前
// (1)
template< class ForwardIt, class OutputIt >
constexpr OutputIt rotate_copy( ForwardIt first, ForwardIt n_first,
ForwardIt last, OutputIt d_first );
// (2)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt2 rotate_copy( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 n_first,
ForwardIt1 last, ForwardIt2 d_first );
// (1)
template< class ForwardIt, class OutputIt >
OutputIt rotate_copy( ForwardIt first, ForwardIt n_first,
ForwardIt last, OutputIt d_first );
// (2)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt2 rotate_copy( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 n_first,
ForwardIt1 last, ForwardIt2 d_first );
// (1)
template< class ForwardIt, class OutputIt >
OutputIt rotate_copy( ForwardIt first, ForwardIt n_first,
ForwardIt last, OutputIt d_first );
-
(1) 将范围 [
first
;last
) 中的元素复制到从d_first
开始的另一个范围,使得元素*(n_first)
成为新范围的第一个元素,*(n_first - 1)
成为新范围的最后一个元素。 -
(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
时才参与重载决议。
行为未定义
如果 [first
; n_first
) 或 [n_first
; last
) 不是有效范围,或者源范围和目标范围重叠。参数
first last | 要复制的元素范围。 |
n_first | 指向 [ |
d_first | 目标范围的开头。 |
policy | 要使用的执行策略。有关详细信息,请参阅执行策略。 |
类型要求
ForwardIt1 ForwardIt2 ForwardIt3 | LegacyForwardIterator |
OutputIt | LegacyOutputIterator |
返回值
指向复制的最后一个元素之后元素的输出迭代器。
复杂度
给定 N
为 std::distance(first, last)
与 N 呈线性关系。
异常
带有模板参数 ExecutionPolicy
的重载报告错误如下
- 如果作为算法一部分调用的函数执行时抛出异常,并且
ExecutionPolicy
是标准策略之一,则调用std::terminate
。对于任何其他ExecutionPolicy
,行为是实现定义的. - 如果算法未能分配内存,则抛出
std::bad_alloc
。
可能的实现
rotate_copy (1)
template<class ForwardIt, class OutputIt>
constexpr // since C++20
OutputIt rotate_copy(ForwardIt first, ForwardIt n_first,
ForwardIt last, OutputIt d_first)
{
d_first = std::copy(n_first, last, d_first);
return std::copy(first, n_first, d_first);
}
示例
以下代码复制并打印一个向量,同时将所有大于 5
的值替换为 99
。
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
std::vector<int> src {1, 2, 3, 4, 5};
std::vector<int> dest(src.size());
auto pivot = std::find(src.begin(), src.end(), 3);
std::rotate_copy(src.begin(), pivot, src.end(), dest.begin());
for (int i : dest)
std::cout << i << ' ';
std::cout << '\n';
// copy the rotation result directly to the std::cout
pivot = std::find(dest.begin(), dest.end(), 1);
std::rotate_copy(dest.begin(), pivot, dest.end(),
std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n';
}
3 4 5 1 2
1 2 3 4 5