使用erase删除remove_if

Ami*_*nos 1 c++ iterator stl

这件事让我发疯,我无法理解:

// v contains : 101, 1, 2, 3, 4 , 5
v.erase(remove_if(v.begin(), v.end(), bind2nd(less<int>(), 3)), v.end());
// v contains now : 101, 3, 4, 5
Run Code Online (Sandbox Code Playgroud)

为什么在擦除中有v.end()作为第二个参数?我读到remove_if返回一个迭代器到最后一个元素后面的元素没有被删除,它是什么意思.... v.erase(v.begin(),v.end())应该擦除所有的向量元素,但是在上面的例子中它如何不擦除3,4和5?这个东西怎么样?我没有在互联网上找到有关它的东西.

Nat*_*ica 8

remove实际上并没有删除向量中的任何元素,但它将它们移动到向量的末尾.然后它将迭代器返回到新的最后一个元素,这是第一个"已删除"元素.然后,您从该迭代器擦除到向量的末尾,以实际去除向量中的元素.

  • @aminos不这样做.C++很棒. (2认同)