std::reverse_copy() 算法
- 自 C++20 起
- 自 C++17 起
- C++17 之前
// (1)
template< class BidirIt, class OutputIt >
constexpr OutputIt reverse_copy( BidirIt first, BidirIt last, OutputIt d_first );
// (2)
template< class ExecutionPolicy, class BidirIt, class ForwardIt >
ForwardIt reverse_copy( ExecutionPolicy&& policy,
BidirIt first, BidirIt last, ForwardIt d_first );
// (1)
template< class BidirIt, class OutputIt >
OutputIt reverse_copy( BidirIt first, BidirIt last, OutputIt d_first );
// (2)
template< class ExecutionPolicy, class BidirIt, class ForwardIt >
ForwardIt reverse_copy( ExecutionPolicy&& policy,
BidirIt first, BidirIt last, ForwardIt d_first );
// (1)
template< class BidirIt, class OutputIt >
OutputIt reverse_copy( BidirIt first, BidirIt last, OutputIt d_first );
-
(1) 将范围 [
first
;last
) 中的元素复制到从d_first
开始的另一个范围,使得新范围中的元素按相反顺序排列。其行为就像对每个非负
i < (last - first)
执行一次赋值*(d_first + (last - first) - 1 - i) = *(first + i)
。 -
(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
; last
) 和 [d_first
; d_first + (last - first)
) 分别)重叠,则行为未定义
参数
first last | 要复制的元素范围。 |
d_first | 目标范围的开头。 |
policy | 要使用的执行策略。有关详细信息,请参阅执行策略。 |
类型要求
BidirIt | LegacyBidirectionalIterator |
OutputIt | LegacyOutputIterator |
ForwardIt | LegacyForwardIterator |
返回值
指向复制的最后一个元素之后元素的输出迭代器。
复杂度
恰好 last - first
次赋值。
异常
带有模板参数 ExecutionPolicy
的重载报告错误如下
- 如果作为算法一部分调用的函数执行时抛出异常,并且
ExecutionPolicy
是标准策略之一,则会调用std::terminate
。对于任何其他ExecutionPolicy
,行为由实现定义. - 如果算法未能分配内存,则抛出
std::bad_alloc
。
可能的实现
reverse_copy(1)
template<class BidirIt, class OutputIt>
constexpr // since C++20
OutputIt reverse_copy(BidirIt first, BidirIt last, OutputIt d_first)
{
for (; first != last; ++d_first)
*d_first = *(--last);
return d_first;
}
备注
当两个迭代器类型都满足 LegacyContiguousIterator 并具有相同的值类型,并且值类型为 TriviallyCopyable 时,实现(例如 MSVC STL)可能会启用向量化。
示例
#include <algorithm>
#include <iostream>
#include <vector>
int main()
{
auto print = [](std::vector<int> const& v)
{
for (const auto& value : v)
std::cout << value << ' ';
std::cout << '\t';
};
std::vector<int> v {1, 2, 3};
print(v);
std::vector<int> destination(3);
std::reverse_copy(std::begin(v), std::end(v), std::begin(destination));
print(destination);
std::reverse_copy(std::rbegin(v), std::rend(v), std::begin(destination));
print(destination);
}
1 2 3 3 2 1 1 2 3