在将迭代器用作参数时,增加迭代器是否安全?

时间:2008-10-02 07:06:47

标签: c++ iterator

目前我正在尝试从集合中擦除一系列迭代器,但是GCC的标准库似乎被破坏了,因为std :: set :: erase(iterator)应该返回一个迭代器(下一个迭代器),但是在GCC中它返回void(这是标准的吗?)

无论如何我想写:

myIter = mySet.erase(myIter);
但是GCC不喜欢它...... 那么写这个是否安全?

mySet.erase(myIter++);

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

2 个答案:

答案 0 :(得分:9)

没有问题
mySet.erase(myIter++);

操作顺序是明确定义的:myIter被复制到myTempIter中,myIter递增,然后myTempIter被赋予擦除方法。

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

答案 1 :(得分:3)

首先,重新阅读标准,你会看到set :: erase方法的原型是:

void erase(iterator position);

但是,STL中的关联容器是“稳定的”,因为擦除元素不会影响其他元素上的迭代器。这意味着以下行有效:

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