2012-07-20 40 views
1

我一直在阅读最新的C++规范,我无法确定是否可以为相同的元素多次调用remove_if。特别是,我正在寻找std::remove_if正在调用deque迭代器。据我所知,没有原因因为它被称为多次,如果它只是简单地从第一个参数开始并迭代到第二个参数。remove_if谓词保证每个迭代器只能调用一次吗?

我正在使用的代码使用手动引用计数,因此,如果remove_if谓词将返回true,它将递减并删除基础对象引用。显而易见的是,只有对每个元素只调用一次remove_if谓词,否则后续调用将访问已删除的对象。有些东西告诉我,这不能保证是好的,并且会有一个点将同一个元素传递给两个remove_if调用的谓词两次。

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

+3

不是你要问的问题的答案,而是你的问题:'§25.1[algorithms.general]/8' - *“...函数对象pred不应用任何非常量函数通过取消引用的迭代器。“* – 2012-07-20 03:31:49

+1

请注意'remove(_if)'不会*杀死元素,它只会将元素从结尾移动到它们的位置。你必须用erase-remove idiom来“擦除”它们:'cont.erase(std :: remove_if(...),cont.end());',这就是它的工作原理。如果你真的需要你的谓词修改ref计数器,那么你正在做一些非常错误的事情,并且不遵守[RAII原理](http://stackoverflow.com/q/161177/500104)。 – Xeo 2012-07-20 03:39:52

+0

@Xeo是的。处理某人的代码中的一些奇怪的限制,基本上我所拥有的是作为回调提供给库的谓词。本杰明的回答让我第二次猜测这种方法。 – 2012-07-20 03:42:41

回答

2

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

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

原谅我,如果所述参考是有点偏离;这实际上是我第一次正式引用它。我希望这是你正在寻找的信息。

+0

好的。我没有这样想 - 我想迭代器在符合标准时可以传入两次的唯一方法是,如果另一个迭代器被跳过交换;-) – 2012-07-20 03:47:08

+0

@ MahmoudAl-Qudsi,是的,我在想关于这一点,但它实际上只是将两个和两个结合在一起,以确保符合这一点,以及保证函数本身的行为。 – chris 2012-07-20 03:49:22

相关问题