namespace std {
template <class BidirectionalIterator, class OutputIterator>
OutputIterator
reverse_copy(BidirectionalIterator first,
BidirectionalIterator last,
OutputIterator result); // (1) C++03
template <class BidirectionalIterator, class OutputIterator>
constexpr OutputIterator
reverse_copy(BidirectionalIterator first,
BidirectionalIterator last,
OutputIterator result); // (1) C++20
template <class ExecutionPolicy, class BidirectionalIterator, class ForwardIterator>
ForwardIterator
reverse_copy(ExecutionPolicy&& exec,
BidirectionalIterator first,
BidirectionalIterator last,
ForwardIterator result); // (2) C++17
}
概要
イテレータ範囲[first, last)の要素順を逆にし、その結果を出力の範囲へコピーする。
事前条件
[first,last)と[result,result+(last-first))は領域が重なっていてはならない
効果
0 以上 last - first 未満の整数 i について、*(result + (last - first) -1 - i) = *(first + i) を行うことで、[first,last) の範囲を [result,result+(last-first)) へコピーする。
戻り値
result + (last - first)
計算量
正確に last - first 回代入する
例
#include <algorithm>
#include <iostream>
#include <string>
#include <iterator>
int main() {
std::string str = "reverse";
std::reverse_copy(str.begin(), str.end(),
std::ostream_iterator<char>(std::cout, ""));
}
出力
esrever
実装例
template <class BidirectionalIterator, class OutputIterator>
OutputIterator reverse_copy(BidirectionalIterator first,
BidirectionalIterator last,
OutputIterator result) {
while (first != last)
*result++ = *--last;
return result;
}