将其用作参数时,在内部增加迭代器是否安全?
时间:2020-03-06 15:00:46 来源:igfitidea点击:
目前,我正在尝试从集合中删除一系列迭代器,但是GCC的标准库似乎已损坏,因为std :: set :: erase(iterator)应该返回迭代器(下一个迭代器),但是在GCC中,它返回void (这是标准的?)
无论如何我想写:
myIter = mySet.erase(myIter);
但是海湾合作委员会不喜欢它...
那么写这个安全吗?
mySet.erase(myIter++);
谢谢!
编辑:是的,我正在检查mySet.end();
解决方案
没问题
mySet.erase(myIter++);
操作顺序是明确定义的:将myIter复制到myTempIter中,将myIter递增,然后将myTempIter提供给擦除方法。
对于Greg和Mark:不,在调用擦除后,operator ++无法执行任何操作。根据定义,在operator ++返回之后将调用擦除()。
首先,重新阅读标准,我们将看到set :: erase方法的原型为:
void erase(iterator position);
但是,STL中的关联容器是"稳定的",因为擦除一个元素不会影响其他元素上的迭代器。这意味着以下行是有效的:
iterator to_erase = myIter++; mySet.erase(to_erase); // Now myIter is still on the next element