2008-10-02 90 views
1

目前我试图从一组中删除一系列迭代器,但是GCC的标准库似乎被破坏,因为std :: set :: erase(iterator)应该返回一个迭代器(下一个迭代器),但是在GCC中它返回void(这是标准?)当使用它作为参数时,增加一个迭代器是否安全?

反正我想写:

myIter = mySet.erase(myIter); 

但是GCC不喜欢它... ... 因此它是安全的,而不是写这个?

mySet.erase(myIter++); 

谢谢!

编辑:是的,我正在检查mySet.end();

回答

9

没有与

mySet.erase(myIter++); 

没有问题的操作的顺序是明确的:myIter被复制到myTempIter,myIter递增,然后myTempIter被提供给擦除方法。

对于Greg和Mark:不,操作员++在擦除调用后无法执行操作。根据定义,erase()在operator ++返回后调用。

+0

你说的只是因为操作符++已被类重新定义。对于POD,操作员实际上是在线后呼叫的! – PierreBdR 2008-10-02 08:05:50

+0

是的,这是一个有趣的评论。关键在于操作顺序与POD类型无关,因为增量总是定义明确的。 那么你总是可以想象奇怪的情况下,方法有一些访问POD变量的引用,但这不被推荐。 – Camille 2008-10-02 08:32:47

3

首先,重读的标准,你会看到一组::擦除方法的原型为:

void erase(iterator position); 

然而,在STL关联容器是“稳定的”擦除元素不要影响其他元素上的迭代器。这意味着下列行是有效的:

iterator to_erase = myIter++; 
mySet.erase(to_erase); 
// Now myIter is still on the next element 
相关问题