c++ - 是否保证每个迭代器仅调用一次remove_if谓词?

标签 c++ stl iterator deque remove-if

我一直在阅读最新的 C++ 规范,但我无法确定是否可以对同一元素多次调用 remove_if 。特别是,我正在查看在 deque 迭代器上调用 std::remove_if 。据我所知,如果它所做的只是从第一个参数开始并迭代直到第二个参数,那么没有理由多次调用它。

我正在处理的代码使用手动引用计数,因此,如果 remove_if 谓词返回 true,它将递减并删除底层对象引用。明显的问题是,只有在每个元素仅调用一次 remove_if 谓词时,这才有效,否则后续调用将访问已删除的对象。有些事情告诉我,这并不能保证一定会成功,并且在一次 remove_if 调用中,相同的元素将被传递到 remove_if 谓词两次。

如果你有某种疯狂的数据结构来实现迭代器,并且为每个迭代器增量随机选择一个条目,直到它(随机)出现在最终迭代器上,我可以看到这将如何失败。但对于像 dequevectorlist 这样直接的标准化结构,是否可以将单个元素多次传递给谓词?

最佳答案

根据a draft of the standard §23.3.4.6/14:

Complexity: Exactly distance(begin(), end()) applications 
of the corresponding predicate.

如果引用内容有点偏差,请原谅;这实际上是我第一次正式引用它。我希望这是您正在寻找的信息。

关于c++ - 是否保证每个迭代器仅调用一次remove_if谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11572414/

相关文章:

c++ - 使用 C++ 迭代器访问元素

c++ - 我可以迭代一个迭代器范围内但不在另一个迭代器范围内的元素吗?

java - 如何从最后到第一个迭代ArrayList?

c++ - 使用 std::map 时,我应该为键类型重载 operator== 吗?

rust - 如何在 Rust 中正确实现 Iterable 结构?

Java删除数组列表迭代器

c++ - 在同一编译器(vc12)上编译时,是什么导致了重整名称的差异?

php - 通过 C++ 桌面应用程序发送发布请求

c++ - RFB 协议(protocol)中的 PointerEvent 和 DesktopSize

c++ - 为列表内部结构分配空间