remove_if谓词是否保证每个迭代器只调用一次? 我一直在阅读最新的C++规范,我无法确定是否 ReaveVII:< /C> >可以被多次调用同一个元素。特别是,我正在研究在deque迭代器上调用std::remove\u。据我所知,如果它只是从第一个参数开始,然后一直迭代到第二个参数,那么就没有理由多次调用它

remove_if谓词是否保证每个迭代器只调用一次? 我一直在阅读最新的C++规范,我无法确定是否 ReaveVII:< /C> >可以被多次调用同一个元素。特别是,我正在研究在deque迭代器上调用std::remove\u。据我所知,如果它只是从第一个参数开始,然后一直迭代到第二个参数,那么就没有理由多次调用它,c++,stl,iterator,deque,remove-if,C++,Stl,Iterator,Deque,Remove If,我正在处理的代码使用手动引用计数,因此,如果remove\u if谓词返回true,它将递减并删除底层对象引用。一个明显的问题是,如果每个元素只调用一次remove\u if谓词,那么这将只起作用,否则后续调用将访问一个已删除的对象。有些事情告诉我,这不能保证是正确的,并且会出现一个点,即对于单个remove\u if调用,相同的元素将被传递到remove\u if谓词两次 如果你有一种疯狂的数据结构,它实现了迭代器,并且说,随机地为每个迭代器增量选择一个条目,直到它(随机地)出现在最终迭代器上

我正在处理的代码使用手动引用计数,因此,如果
remove\u if
谓词返回true,它将递减并删除底层对象引用。一个明显的问题是,如果每个元素只调用一次
remove\u if
谓词,那么这将只起作用,否则后续调用将访问一个已删除的对象。有些事情告诉我,这不能保证是正确的,并且会出现一个点,即对于单个
remove\u if
调用,相同的元素将被传递到
remove\u if
谓词两次

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

根据§23.3.4.6/14:

Complexity: Exactly distance(begin(), end()) applications of the corresponding predicate. 复杂性:精确距离(begin(),end())应用程序 对应谓词的。
如果参考资料有点不符,请原谅我;这实际上是我第一次正式引用它。我希望这是您正在寻找的信息。

不是您所问问题的答案,而是您的一个问题:
§25.1[算法.概述]/8
-“…函数对象pred不应通过解引用迭代器应用任何非常量函数。”请注意,
删除(\u if)
不会杀死元素,它仅将元素从末端移动到其所在位置。您必须使用erase-remove习惯用法
cont.erase(std::remove_if(…),cont.end());然后
erase
,这就是它的工作原理。如果您真的需要您的谓词来修改ref计数器,那么您正在做一些非常错误的事情,并且没有遵守规则。@Xeo是的。处理某人代码中的一些奇怪限制时,基本上我所拥有的只是作为回调提供给库的谓词。本杰明的回答让我对这种方法进行了二次猜测。捕捉得好。我没有这样想-我想一个迭代器可以传入两次,同时仍然符合标准的唯一方法是在交换中跳过另一个迭代器;-)@MahmoudAl Qudsi,是的,我也在考虑这个问题,但它实际上只是把二和二放在一起,它符合这一点,以及函数本身的保证行为。因为
O(kn)
也等于
O(n)
这并不能明确回答这个问题。