c++中algorithm中的remove和remove_if()使用后都会返回一个指向容器末尾的迭代器,但容器大小一直未进行调整,。删除算法删除元素时,其他元素将向前移动,但是size()的返回值没有发生改变,这意味着vector末尾还有其他值。需要调整大小(否则末尾将包含不需要的值),需要调用erase(),将其remove()或者remove_if()返回的迭代器传递给他。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(int argc,char** argv){
vector<int> listIntegers(20);
for(int count=0;count<10;++count)
{
listIntegers.push_back(count);
}
for_each(listIntegers.begin(),listIntegers.end(),[](const int& param){ cout<<param<<" ";});
cout<<endl;
cout<<"sizeof vector(origin): "<<listIntegers.size()<<endl;
auto zeroremove = remove(listIntegers.begin(),listIntegers.end(),0);
for_each(listIntegers.begin(),listIntegers.end(),[](const int& param){ cout<<param<<" ";});
cout<<endl;
cout<<"sizeof vector(after remove 0): "<<listIntegers.size()<<endl;
listIntegers.erase(zeroremove,listIntegers.end());
for_each(listIntegers.begin(),listIntegers.end(),[](const int& param){ cout<<param<<" ";});
cout<<endl;
cout<<"sizeof vector(after remove and eraser 0): "<<listIntegers.size()<<endl;
system("pause");
return 1;
}
仅仅remove就会出现脏数据,容器的size也没有进行改变,这不是我们想要的,所以我们一定要在remove后调用容器的.erase()方法。(记住要传入vector.end()) 因为remove()返回值是容器的末尾。
|