为什么std :: whatever :: erase()方法和std :: remove()是一个独立的函数?

ein*_*ica 0 c++ stl

erase()和之间有什么区别remove()

  • std::whatever::erase - 获取范围迭代器(first-last),并匹配所有元素.
  • std::remove - 获取范围迭代器(first-last)和匹配删除的值.

除此之外,看起来他们做同样的事情.即在两种情况下实际的"擦除"或"移除"都是相同的(除非我弄错了).那么,为什么其中一个是(矢量,集合,映射等)方法,另一个是自由浮动函数?

笔记:

  • 是的,我知道还有一个erase()需要一个迭代器,但你也可以std::remove()使用相同的语义.

Jer*_*fin 7

擦除或删除是一样的.

erase 实际上从集合中删除项目.

std::remove 使集合保持与开始时相同的大小,但是压缩集合中的项目,因此具有您想要删除的值的那些已被具有其他值的集合中的值覆盖.

换句话说,如果你开始使用1, 2, 1, 3,并且remove(..., 1)你最终得到一个包含的集合2, 3, x, x,其中x表示一些未知值(可能是一个移动的值,所以如果它们是字符串,它们可能会变成空字符串).

当它完成时,它将迭代器返回到第一个的位置x.如果您想要从集合中实际删除这些项目,则可以调用collection.erase(returned_iterator, collection.end())(也就是删除/擦除习语).

如果你关心为什么事情是这样的,一个原因是std::remove与迭代器一起工作.一个迭代允许访问的元素一个容器中,但不与周围的容器本身.因此,不可能std::remove从容器中擦除元素,即使对于支持该容器的容器(而不是所有容器)也是如此.