C++; C++中的分区()/和删除()/函数有什么不同? 删除实际上不移除容器的任何元素,但是将“被移除”元素放在元素序列的开始处,分区也做同样的事情。 < P>从C++标准库:教程和参考< /P>

C++; C++中的分区()/和删除()/函数有什么不同? 删除实际上不移除容器的任何元素,但是将“被移除”元素放在元素序列的开始处,分区也做同样的事情。 < P>从C++标准库:教程和参考< /P>,c++,C++,remove()-删除具有给定值的元素,逻辑上仅通过使用以下未删除的元素覆盖它们。请勿更改其操作范围内的元素数量。相反,它们返回范围的新“端点”的位置 partition()-更改元素的顺序,使符合条件的元素位于前面 稳定分区()-与分区()相同,但保留匹配和非匹配元素的相对顺序 分区-根据特定谓词(“分组”容器的元素(例如std::vector中的奇数和偶数) 移除-从容器中移除特定值;事实上,元素被移动到初始容器的末尾,一个迭代器被返回到新的末尾,“删除的”元素仍然可以访问 编辑: 移除-从

remove()-删除具有给定值的元素,逻辑上仅通过使用以下未删除的元素覆盖它们。请勿更改其操作范围内的元素数量。相反,它们返回范围的新“端点”的位置

partition()-更改元素的顺序,使符合条件的元素位于前面

稳定分区()-与分区()相同,但保留匹配和非匹配元素的相对顺序

分区-根据特定谓词(“分组”容器的元素(例如std::vector中的奇数和偶数)

移除-从容器中移除特定值;事实上,元素被移动到初始容器的末尾,一个迭代器被返回到新的末尾,“删除的”元素仍然可以访问

编辑:


移除-从容器中移除特定值;如上所述,元素不会移动到初始容器的末尾,返回到新端的迭代器,但返回范围中的迭代器[newEnd,last)仍然是可取消引用的,因此可以访问,但它们指向的元素未指定。

remove\u如果
没有将删除的元素放在任何位置;新端点之后的元素将有其旧值,因此一些删除的元素可能丢失,而一些保留的元素可能重复它比
分区
快,并且可以使用前向迭代器完成,而
分区
需要双向迭代器


更新:在C++0x中,
分区
只需要前向迭代器,但如果迭代器不是双向的,则速度会更慢。

如果我理解正确,
remove
实际上并不交换任何元素,而只是移动谓词所针对的元素(如果
remove\u
)对于序列的开头为false。如果

a=[1,1,1,2,3]

然后调用
remove(a.begin(),a.end(),1)
,您将

a=[2,3,1,2,3]

之后。
remove
将迭代器返回到本例中的第三个元素(如果我没记错的话…)

另一方面,
partition
保留序列的所有原始元素,但更改它们的顺序,以便将给定谓词为true的元素放在其为true的元素之前

分区(a.begin()、a.end()、not_equal(1))

a=[2,3,1,1,1]

remove[…]将“removed”元素放在序列的开头

什么?否。
remove\u if
partition
都将“good”元素放在第一位。
partition
将“bad”元素放在第二位,而
remove\u if
没有指定后面是什么——它可能是bad元素,但也可能是任何(good或bad)元素的副本


例如,如果
partition
12345为偶数,则可能会得到24531(注意每个元素只出现一次),而如果
remove\u为奇数元素,则可能会得到24545(注意重复项).

这是错误的,remove会用以下元素覆盖“removed”元素,因此以后可能无法访问所有元素……如果可能的话,我想知道我的答案有什么问题。也许我会在这个过程中学到一些东西。@MartinStettner我想你错了。从文档中“remove removes From the range”[first,last)所有等于value的元素。也就是说,remove返回一个迭代器new_last,使得范围[first,new_last]不包含等于value的元素。[1]范围中的迭代器[new_last,last)仍然是可取消引用的,但它们指向的元素未指定。Remove是稳定的,这意味着不等于value的元素的相对顺序不变。”STL文档中引用:“范围内的迭代器[new_last,last)仍然是可取消引用的,但它们指向的元素未指定。”这就是您的答案中的错误所在。没有元素移动到容器的末尾,无论如何也不一定如此。@MartinSttetner@haffax确实是我错了。编辑答案以反映这一点。谢谢。请注意,不保证什么
std::remove()
在新的结束迭代器返回后留下。虽然您显示的结果很可能,但不能保证。我认为
std::remove
可以保证新的结束迭代器后面的元素保持不变(它们也将保持可访问性)。但我可能被标准证明是错误的:)…标准没有指定在新范围结束后元素会发生什么。虽然很难想象任何合理的实现会触及它们,但也不能保证。如果在std::列表上执行智能操作,可以想象std::remove_。交换节点可能会大大减少此外,可以想象,一些实现会在
std::vector
中移动值,因为这比复制它们便宜。或者它甚至会交换它们,让调用方决定是否销毁其余的对象。如果
分区
需要双向迭代器,为什么它会在
forward\u list
?@FredOverflow:因为C++0x将
分区的契约更改为向前推进迭代器。
分区
在某些情况下比
remove\u if
快得多。如果要删除的元素位于一个大向量的开头,则
remove\u if