C++中的函数partition()和remove()函数有什么区别?
remove实际上并不删除容器的任何元素,而是将'removed'元素放在元素序列的开头,而partition也做同样的事情.
fre*_*low 47
remove [...]将'removed'元素放在序列的开头
什么?这两个号remove_if,并partition把"好"的第一要素.partition在此之后放置"坏"元素,remove_if而不指定它之后的内容 - 它可能是坏元素,但它也可能是任何(好的或坏的)元素的副本.
例如,如果你partition在偶数上1 2 3 4 5 ,你可能得到2 4 5 3 1(注意每个元素恰好出现一次),而如果你remove_if是奇数元素,你可能得到2 4 3 4 5(注意重复).
Mik*_*our 15
remove_if不会将删除的元素放在任何地方; 新结束后的元素将具有旧值,因此可能会丢失一些已删除的元素,并且可能会复制某些保留的元素.这比partition使用partition双向迭代器更快,可以使用前向迭代器完成.
更新:在C++ 0x中,partition只需要前向迭代器,但如果迭代器不是双向的,则会更慢.
如果我理解正确,remove实际上并不交换任何元素,而只是将谓词(如果是remove_if)为假的元素移动到序列的开头.如果你有
a = [1,1,1,2,3]
然后打电话给remove(a.begin(),a.end(),1)你
a = [2,3,1,2,3]
然后.remove在这种情况下返回第三个元素的迭代器(如果我没记错的话......)
partition 另一方面,保留序列的所有原始元素,但改变它们的顺序,使得给定谓词为真的元素放在元素的前面.
partition(a.begin(), a.end(), not_equal<int>(1)) 产量
a = [2,3,1,1,1]