在将其用作参数时,在内部增加迭代器是否安全
Is it safe to increase an iterator inside when using it as an argument?
目前我正在尝试从集合中删除一系列迭代器,但是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
相关文章:
- 如何在公共头文件中向库的用户公开枚举,同时在内部使用它?
- std::strlen 在内部是如何工作的?
- STRCMP内部IF在内部不起作用
- "std::string"是否将其字符作为签名字符在内部存储?
- 虚拟基类在内部如何工作?编译器如何解析对基方法的调用?
- C++:在"try"外部创建的类型会导致错误,但在内部不会
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 特征运算符如何在内部解释为 MKL 函数?
- 指向C++中成员的指针如何在内部工作?
- 删除和删除[]在内部如何工作?
- 自动参数如何在内部工作
- C++放置位置删除如何在内部(C++运行时)工作?如何克服其局限性?
- 在内部使用ComboBox拖动ListWidget项目
- 为什么实体可以在内部范围内重用?C++
- 如果不允许我分配 rvalues 来引用为什么以下代码片段有效,这在内部如何工作?
- 使用 java 类在 C++ 内部导入外部 jarfile
- 为 c++ 构建一个静态库,该库在内部依赖于第三方库
- 如何将负数转换为更广泛的类型在内部工作
- 为什么 QVector 的迭代器使用前缀增加,而后缀在内部减少?
- 在将其用作参数时,在内部增加迭代器是否安全