首页 > 代码库 > vector中的删除,earse和remove的小疑惑--【STL】
vector中的删除,earse和remove的小疑惑--【STL】
对于vector容器的使用,平时只是简单的进行遍历查找一下,未曾进行其它操作,这不,今天出了一点差错;
erase方法的操作是将此时的节点删除,然后指向被删除节点的下一个:
如对数据1 6 6 4 7;
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> vec; vec.push_back(1); vec.push_back(6); vec.push_back(6); vec.push_back(4); vec.push_back(7); vector<int>::iterator arr; //vec.erase(remove(vec.begin(), vec.end(), 6), vec.end()); for(arr = vec.begin(); arr != vec.end(); arr++) { if(6 == *arr) { vec.erase(arr); //arr--; } } cout << "The size of vector is :" << vec.size() << endl; for(arr = vec.begin(); arr != vec.end(); arr++) { cout << *arr << " "; } cout << endl; return 0; }进行如上操作的结果为:
有一个6未成功删除,由于每次循环后都将迭代器arr++,在成功删除之后节点后移了一位,实际上在删除进行时是后移了两位,故而在删除时:
for(arr = vec.begin(); arr != vec.end(); arr++) { if(6 == *arr) { vec.erase(arr); arr--; } }有了arr--操作,就可抵消删除时的自动后移,从而成功进行:
当然,erase还有另外一个方法,就是删除两个节点之间的全部元素,这时依靠remove操作将等于删除值的节点全部移到容器末尾,进行删除;
将上述for循环删除的注释,将其上一行的vec.erase(remove(vec.begin(), vec.end(), 6), vec.end());注释取消即可实现;
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> vec; vec.push_back(1); vec.push_back(6); vec.push_back(6); vec.push_back(4); vec.push_back(7); vector<int>::iterator arr; vec.erase(remove(vec.begin(), vec.end(), 6), vec.end()); // /*for(arr = vec.begin(); arr != vec.end(); arr++) { if(6 == *arr) { vec.erase(arr); arr--; } }*/ cout << "The size of vector is :" << vec.size() << endl; for(arr = vec.begin(); arr != vec.end(); arr++) { cout << *arr << " "; } cout << endl; return 0; }
O(∩_∩)O
vector中的删除,earse和remove的小疑惑--【STL】
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。