STL"擦除 - 删除"成语:为什么不"调整大小 - 删除"?

Dan*_*aum 10 c++ stl erase-remove-idiom

通常理解的std::vector是,从a中完全删除所需项目的好方法是擦除 - 移除习语.

如上面链接中所述(截至本帖发布之日),在代码中,erase-remove惯用法如下所示:

int main()
{
  // initialises a vector that holds the numbers from 0-9.
  std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

  // erase-remove idiom to completely eliminate the desired items from the vector
  v.erase( std::remove( std::begin(v), std::end(v), 5 ), std::end(v) ); 
}
Run Code Online (Sandbox Code Playgroud)

我想知道resize-remove成语在功能和性能方面是否与成语相同erase-remove.或者,也许我错过了一些明显的东西?

以下resize-remove成语是否等同于上述erase-remove成语?

int main()
{
  std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

  // Is this "resize-remove" approach equivalent to the "erase-remove" idiom?
  v.resize( std::remove( std::begin(v), std::end(v), 5 ) - v.begin() ); 
}
Run Code Online (Sandbox Code Playgroud)

ikh*_*ikh 10

在我看来,有两个原因:

  1. std::remove算法只需要Forward Iterator,但-op需要Random Access Iterator.

  2. 结果std::remove意味着"容器的新结束".从逻辑上讲,我们应该擦除["容器的新端","容器的旧端").

  • 第一个是非常好的一点(尽管它不会影响`std :: vector`). (3认同)

gre*_*ern 5

它等同于std :: vector,但不适用于std :: list或其他容器.不确定是否可以为std :: list减去迭代器,即使它是,也是O(N)操作.