目前我正在尝试从一个集合中擦除一个迭代器序列,但是,由于std:: set :: erase ( iterator )应该返回一个迭代器(下一个迭代器),所以GCC的标准库似乎被破坏了,但是在GCC中,它返回void (这是标准的吗?)
不管怎样,我想写:
myIter = mySet.erase(myIter);但是GCC不喜欢这样。那么写这篇文章安全吗?
mySet.erase(myIter++);编辑:是的,我正在检查mySet.end();
发布于 2008-10-02 07:45:03
不存在任何问题
mySet.erase(myIter++);操作的顺序是明确定义的:将myIter复制到myTempIter中,递增myIter,然后将myTempIter赋给erase方法。
的:不,在调用erase之后,operator++不可能执行操作。根据定义,erase()在operator++返回之后调用。
发布于 2008-10-02 07:51:07
首先,重新阅读标准,您将看到set::erase方法的原型是:
void erase(iterator position);然而,STL中的关联容器是“稳定的”,因为擦除一个元素不会影响其他元素上的迭代器。这意味着以下行是有效的:
iterator to_erase = myIter++;
mySet.erase(to_erase);
// Now myIter is still on the next elementhttps://stackoverflow.com/questions/161166
复制相似问题