不将迭代器用于调整大小的向量

时间:2010-01-22 20:33:06

标签: c++ iterator containers

我读了“C ++编程语言:特别版”

Don't use iterators into a resized vector

考虑这个例子。

vector< int >::iterator it = foo.begin();

while ( it != foo.end() ) {
  if ( // something ) {
    foo.push_back( // some num );
  }
  ++it;
}

这有问题吗?调整向量大小后,循环条件中的foo.end()是否会向前推送1?

P.S。另外,如果向量为x个整数保留了空间,该怎么办?如果push_back没有违反这个空格,它仍然是一个问题(如果it.end()指向一个超过包含某些东西的向量中的最后一个元素,我会假设这样。)

4 个答案:

答案 0 :(得分:5)

是的,它存在问题。

push_back的任何调用都有可能使所有迭代器无效为向量。

foo.end()将始终检索有效的结束迭代器(可能与foo.end()最后返回的值不同),但it可能已失效。这意味着递增或比较它可能会导致未定义的行为。

答案 1 :(得分:1)

是的,有问题。无论foo.end()如何,it都可能使push_back()无效。编辑:(即它不是只是结束可能会改变;可能会重新分配向量的整个缓冲区,因此所有迭代器变得无效)。

答案 2 :(得分:1)

是的,这有问题。 push_back使您调用它的向量的任何迭代器无效。因此,在致电push_back后,执行++it甚至是不合法的。这是一个未定义行为的情况,因此它有时可能会起作用,有时可能会失败,但您永远不应该依赖它。

答案 3 :(得分:0)

正如其他人所说,push_back()可能会使向量的所有迭代器无效。其原因是向量中的数据存储在连续存储器的区域中。如果push_back()或任何其他调整向量大小的操作导致向量的大小超过分配区域的容量,该区域将被重新分配并最终在内存中的不同位置,而所有迭代器仍将是引用旧的内存区域。