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

Is it safe to increase an iterator inside when using it as an argument?

本文关键字:增加 在内部 迭代器 是否 安全 参数      更新时间:2023-10-16

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

无论如何我想写:

myIter = mySet.erase(myIter);

但是海湾合作委员会不喜欢它...那么写这个安全吗?

mySet.erase(myIter++);

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

没有问题

mySet.erase(myIter++);

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

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

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

void erase(iterator position);

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

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