iterator和back_insert_iterator有什么区别?

Alg*_*lgo 4 c++ stl

如果随机访问迭代器可以用来访问相对于它们所指向的元素的任意偏移位置的元素(不知何故像指针),为什么不能在通用算法std::copy()中使用它们而不是使用它们back_insert_iterator,两者之间的区别是什么?

Naw*_*waz 12

std::back_insert_iterator是一个特定类型输出迭代器支持push_back的操作.当你使用它写入它时operator=,它将值push_backs到底层容器中 - 因此,从这个意义上说,它充当具有push_back成员函数的容器的适配器.

一个例子很容易理解:

std::vector<int> v;

std::back_insert_iterator<std::vector<int>>  it(v);

*it = 10; // it is equivalent to v.push_back(10);
 it = 99; // it is ALSO equivalent to v.push_back(99);

for (auto const & i : v)
    std::cout << i << " " ; //10 99
Run Code Online (Sandbox Code Playgroud)

它输出:

10 99
Run Code Online (Sandbox Code Playgroud)

在线演示.

通常的迭代器操作++*on it无效.

但是你很少直接使用它们(我从未直接使用它直到现在).您可以将它们与算法一起使用,例如std::copy在这种情况下,您还可以使用返回类型对象的std::back_inserter 函数std::back_insert_iterator.

//assuming dest is a container which supports push_back!
std::copy(src.begin(), src.end(), std::back_inserter(dest));
Run Code Online (Sandbox Code Playgroud)

您还希望看到以下(适配器)迭代器:

因此,根据容器,您选择适配器迭代器.

请注意,它们都是输出迭代器.

为什么不能在std :: copy()等通用算法中使用它们而不是使用back_insert_iterator.

当然,您可以在算法中使用随机访问迭代器(或任何输出迭代器),例如std::copy,作为第三个参数,但假设迭代器引用现有范围 - *it并且++it为您传递的值定义良好.您传递它们以覆盖范围的现有元素,而向容器std::back_insert_iterator 添加新元素.

希望有所帮助.