C++中partition()和remove()函数之间的区别

Dav*_*lis 33 c++

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(注意重复).

  • 为了完整起见: `remove_if` 保留“好”元素的相对顺序,而 `partition` 可能会重新排列它们,因此 `partition` 可以输出 4 2 5 1 3。如果好元素的相对顺序,请使用 `stable_partition`重要的是,它的输出保证为 2 4 1 3 5,保持每组的相对顺序不变。 (2认同)

Mik*_*our 15

remove_if不会将删除的元素放在任何地方; 新结束后的元素将具有旧值,因此可能会丢失一些已删除的元素,并且可能会复制某些保留的元素.这比partition使用partition双向迭代器更快,可以使用前向迭代器完成.

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

  • 在某些情况下,`partition` 比 `remove_if` 快得多。如果要删除的元素位于一个巨大向量的开头,`remove_if` 会将整个元素向左移动,而 `partition` 只会将要删除的元素与最后一个元素交换。 (2认同)

Mar*_*ner 5

如果我理解正确,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]

  • 请注意,不能保证`std :: remove()`会留下_after_它返回的新结束迭代器.虽然您展示的结果很可能,但并不能保证. (3认同)
  • 可以想象std :: remove_if在std :: list上做智能事情.交换节点可能比分配它们的value_types便宜得多. (3认同)
  • 此外,可以想象在`std :: vector <std :: string>`中有一些实现__moves__值,因为这比复制它们便宜.或者它甚至可以__swaps_它们,将它留给调用者是否要销毁剩余的对象. (2认同)