stl插入迭代器

时间:2010-02-08 18:20:15

标签: c++ stl iterator

也许我错过了一些完全明显的东西,但我无法弄清楚为什么会使用back_inserter / front_inserter / inserter, 而不是仅从容器接口提供适当的迭代器。 这就是我的问题。

4 个答案:

答案 0 :(得分:4)

因为那些调用push_back,push_front和insert的容器的“普通”迭代器不能(或者,至少不会)。

示例:

int main() {
  using namespace std;
  vector<int> a (3, 42), b;

  copy(a.begin(), a.end(), back_inserter(b));

  copy(b.rbegin(), b.rend(), ostream_iterator<int>(cout, ", "));
  return 0;
}

答案 1 :(得分:2)

主要原因是常规迭代器迭代容器中的现有元素,而* inserter系列迭代器实际上在容器中插入新元素。

std::vector<int> v(3);  // { 0, 0, 0 }
int array[] = { 1, 2, 3 };
std::copy( array, array+3, std::back_inserter(v) ); // adds 3 elements
   // v = { 0, 0, 0, 1, 2, 3 }
std::copy( array, array+3, v.begin() ); // overwrites 3 elements
   // v = { 1, 2, 3, 1, 2, 3 } 
int array2[] = { 4, 5, 6 };
std::copy( array2, array2+3, std::inserter(v, v.begin()) );
   // v = { 4, 5, 6, 1, 2, 3, 1, 2, 3 }

答案 2 :(得分:0)

迭代器指向一个元素,一般不知道它附加到哪个容器。 (迭代器基于指针,你无法从指针告诉它与之相关的数据结构。)

向STL容器添加元素会更改容器的描述。例如,STL容器具有.size()功能,必须更改。由于某些元数据必须更改,因此无论是什么插入新元素都必须知道它添加到哪个容器。

答案 3 :(得分:0)

这完全取决于你真正需要什么。根据您的意图,可以使用这两种迭代器。

当您使用“普通”迭代器时,它不会在容器中创建新元素。它只是将数据一个接一个地写入容器的现有连续元素中。它会覆盖容器中已有的任何数据。如果允许它到达序列的末尾,则任何进一步的写入都会使其“脱离结束”并导致未定义的行为。即它崩溃了。

另一方面,

插入器迭代器创建一个新元素,并在每次通过它们写入内容时将其插入当前位置(正面,背面,中间某处)。它们从不覆盖现有元素,而是添加新元素。