2

那个页面上,据说:

这会使所有迭代器和对 position 或 first 之后的元素的引用无效。

这是否意味着迭代器在擦除后有效positionfirst

(显然,我这样问是因为我想在 for_each 循环期间删除向量中的某些项目。)

谢谢你。

4

5 回答 5

2

根据http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#414 positonfirst应被视为无效 - 标准中的措辞不清楚,但作为迭代器和引用在一句话,并且对已擦除元素的引用没有意义,“认为理所当然”的是擦除使指向已擦除元素的迭代器无效。我会避免依赖于被擦除的迭代器是有效的——当你begin()从一个带有一个元素的向量中擦除时,我不会想当然地认为迭代器突然等于end()

于 2011-03-21T15:00:40.653 回答
2

通常,如果您尝试从vector一个循环中删除多个项目,使用remove_if将比erase在每个项目上使用提供更好的性能。考虑这个而不是迭代擦除。

但是,要回答您的问题,是的,它们是有效的,但是在再次测试迭代器之前要小心增加迭代器end,因为擦除可能会使您的迭代器现在等于end. 编辑:@Erik 的回答表明它实际上可能无效,但措辞不清楚。

于 2011-03-21T15:01:02.163 回答
0

是的。但它们不会像在 之前那样引用相同的元素erase(),因为该元素将被删除!

于 2011-03-21T14:56:27.117 回答
0

如果您在迭代时擦除,请考虑以下语法:

vector<int> items = ...;

for(vector<int>::iterator it = items.begin() ; it != items.end() ; /*inline*/)
{
   if(/* should erase*/)
      it = items.erase(it);
   else
      ++it;
}

这是有效的,因为erase()返回一个迭代器到当前元素之后的下一个元素。所以,如果你擦除,它会“增加”,否则,你会像往常一样增加它。正如其他人所指出的那样,这不是很有效(因为当前元素之后的所有元素都被向前复制),并且有更好的方法。例如,正如 Mark B 所提到的,使用remove_if.

于 2011-03-21T15:03:58.723 回答
0

它是这么说的,但它是错误的。根据标准,它们是无效的(这是有道理的,因为要保持有效,它们必须指向一个不再存在的元素)。

于 2011-03-21T15:07:31.760 回答