本文主要解释一下remove()与erase()函数在删除容器中元素时的使用:
(在使用remove()函数进行删除vector里面的函数时,不仅要包含头文件<vector>,还要包含头文件<algorithm>,
不然编译会出错:error C2660: “remove”: 函数不接受 3 个参数,
此时是因为就变成调用remove()文件的函数了,而它只有一个参数,在stdio.h中 int remove( const char * filename );)
- iterator的使用陷阱:
- vector<int> temp;
- temp.push_back(1);
- temp.push_back(6);
- temp.push_back(6);
- temp.push_back(3);
-
- for(vector<int>::iterator iter=temp.begin(); iter!=temp.end(); iter++)
- {
- if( *iter == 6)
- iter=veci.erase(iter);//指向被删除元素的下一个元素;自加后指向 再后一个元素;
- }
这样使用是错误的,因为erase结束后,iter失效了,erase()返回值是一个迭代器,iter++就产生了错误,并不指向下一个6,指向了3,所以只能删除一个6。
可以修改为以下,可以删除所有的6:
- for(vector<int>::iterator iter=temp.begin(); iter!=temp.end(); )
- {
- if( *iter == 3)
- iter = veci.erase(iter);
- else
- iter ++ ;
- }
也可以结合remove()进行删除:
- temp.erase(remove(temp.begin(),temp.end(),6),temp.end());
remove()是STL的通用算法std::remove(first,last,val)移除[first,last)范围内等于val的元素,但是这个函数只是把val移到temp的末尾,并不真正删除,如要删除,需要结合erase(),如上。(注:first,last是迭代器)