1

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

无论如何我想写:

myIter = mySet.erase(myIter);

但是 GCC 不喜欢它......所以写这个安全吗?

mySet.erase(myIter++);

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

4

2 回答 2

9

没有问题

mySet.erase(myIter++);

操作顺序是明确定义的:将 myIter 复制到 myTempIter 中,将 myIter 递增,然后将 myTempIter 提供给擦除方法。

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

于 2008-10-02T07:45:02.557 回答
3

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

void erase(iterator position);

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

iterator to_erase = myIter++;
mySet.erase(to_erase);
// Now myIter is still on the next element
于 2008-10-02T07:51:06.757 回答