供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; }
进行如上操作的结果为:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGptMTk5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >
有一个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
版权声明:本文博客原创文章,博客,未经同意,不得转载。
时间: 2024-10-03 09:14:01