10

在实际使用方面有什么区别

a)copy_backward

b) 使用 reverse_iterators 复制源和目标

特别是一个比另一个更普遍适用?还有其他区别吗?

更新:如果真的没有区别,那么 C++ 文献中对此等价的任何引用都将受到赞赏。这个问题背后的动机是了解这是设计使然还是其中一个失误(例如缺少 copy_if)

4

5 回答 5

5

首先,使用 copy_backward() 清楚地表明开发人员打算以相反的顺序复制间隔。

copy_backward() 适用于原始的双向迭代器,而 reverse_iterator 是双向迭代器的适配器,可能不如原始迭代器有效。

当您需要将诸如 copy() 之类的输入迭代器的算法应用于反向序列时,使用 reverse_iterator 是有意义的,但没有用于诸如 copy_backward() 之类的双向运算符的对应物。

因此,存在概念上实践上的差异。

于 2012-05-24T07:25:44.733 回答
2

http://www.cplusplus.com/reference/algorithm/copy/有一个实现std::copy

http://www.cplusplus.com/reference/algorithm/copy_backward/有一个实现std::copy_backward

您可以自己查看差异。

注意:如果我是你,我会使用,因为使用类std::copy_backward调用可能会慢一些(它需要比双向迭代器更多的内存)std::copystd::reverse_iterator<T>

于 2012-05-27T13:23:04.153 回答
0

不同之处在于copy将迭代器返回到传递结束元素,而copy_backward将迭代器返回到第一个元素。

从这个意义上说,它们是不等价的。

  • 签名当然不同。copy可以使用InputIterators 和OutputIterator. 虽然copy_backward期望BidirectionalIterators。
  • 对容器的影响(正确使用时)是一样的,但返回的迭代器类型不同,指向不同的元素。

例子:

这是可行的,因为vector可以使用RandomAccessIteratorwhich 确实支持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也是不可能的,因为它不支持反向迭代器。

基本上,您需要确保支持容器的迭代器,并根据您希望返回的容器的哪一端进行选择。否则效果是一样的。

于 2015-08-11T06:23:16.690 回答
-1

实际上没有区别。以同样的方式,您可以比较正向复制。

复印件

b) 带有反向迭代器的 copy_backward。

于 2012-05-14T08:08:27.383 回答
-1

但是,应该没有任何区别:如果迭代器是某些函数调用的结果,并且与使用带有反向迭代器的复制相比,copy_backward 会派上用场。

于 2012-05-21T19:57:49.447 回答