在实际使用方面有什么区别
a)copy_backward
b) 使用 reverse_iterators 复制源和目标
特别是一个比另一个更普遍适用?还有其他区别吗?
更新:如果真的没有区别,那么 C++ 文献中对此等价的任何引用都将受到赞赏。这个问题背后的动机是了解这是设计使然还是其中一个失误(例如缺少 copy_if)
首先,使用 copy_backward() 清楚地表明开发人员打算以相反的顺序复制间隔。
copy_backward() 适用于原始的双向迭代器,而 reverse_iterator 是双向迭代器的适配器,可能不如原始迭代器有效。
当您需要将诸如 copy() 之类的输入迭代器的算法应用于反向序列时,使用 reverse_iterator 是有意义的,但没有用于诸如 copy_backward() 之类的双向运算符的对应物。
因此,存在概念上和实践上的差异。
http://www.cplusplus.com/reference/algorithm/copy/有一个实现std::copy
http://www.cplusplus.com/reference/algorithm/copy_backward/有一个实现std::copy_backward
您可以自己查看差异。
注意:如果我是你,我会使用,因为使用类std::copy_backward
调用可能会慢一些(它需要比双向迭代器更多的内存)std::copy
std::reverse_iterator<T>
不同之处在于copy
将迭代器返回到传递结束元素,而copy_backward
将迭代器返回到第一个元素。
从这个意义上说,它们是不等价的。
copy
可以使用InputIterator
s 和OutputIterator
. 虽然copy_backward
期望BidirectionalIterator
s。例子:
这是可行的,因为vector
可以使用RandomAccessIterator
which 确实支持InputIterator
,OutputIterator
和所期望的属性BidirectionalIterator
。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void printer(int i) {
cout << i << ", ";
}
int main() {
int mynumbers[] = {3, 9, 0, 2, 1, 4, 5};
vector<int> v1(mynumbers, mynumbers + 7);
vector<int>::iterator it = copy_backward(mynumbers, mynumbers + 7, v1.end());
for_each(v1.begin(), v1.end(), printer);
cout << endl << "Returned element: " << *it;
cout << endl;
vector<int>::reverse_iterator rit = copy(mynumbers, mynumbers + 7, v1.rbegin());
for_each(v1.begin(), v1.end(), printer);
cout << endl << "Before the first element (reverse end)? " << (rit == v1.rend());
rit--; // go to first element, because it is a reverse iterator
cout << endl << "Returned element: " << *rit;
return 0;
}
结果:
3, 9, 0, 2, 1, 4, 5,
Returned element: 3
5, 4, 1, 2, 0, 9, 3,
Before the first element (reverse end)? 1
Returned element: 5
如果您使用不支持的容器,BidirectionalIterator
那么您将面临麻烦(例如,如果您尝试向后复制 a ,forward_list
因为它使用 a ForwardIterator
,它不支持 a 提供的操作BidirectionalIterator
)。
同样在这种情况下,使用反向迭代器进行复制forward_list
也是不可能的,因为它不支持反向迭代器。
基本上,您需要确保支持容器的迭代器,并根据您希望返回的容器的哪一端进行选择。否则效果是一样的。
实际上没有区别。以同样的方式,您可以比较正向复制。
复印件
b) 带有反向迭代器的 copy_backward。
但是,应该没有任何区别:如果迭代器是某些函数调用的结果,并且与使用带有反向迭代器的复制相比,copy_backward 会派上用场。