vector容器中删除元素需要注意几个新手问题
《1》erase后,end位置发生变化
《2》erase返回其下一个元素
原则:
1.如果只删除其中一个元素,那么可以erase后return,不会有问题
2.如果删除多个元素:
for(vector<int>::iterator iter=vect.begin(); iter!=vect.end(); ) { if(*iter == 3) iter = vect.erase(iter); else iter++; }
《3》也许你看了上面的感觉很简单,不就是那样么。是的,就是这样,但是在我们工作的环境中,不同的应用会让你失去对代码的判断力。
举个例子,上面代码能很好的处理删除动作。也许我就这么copy一下就ok了,no也许功能要求你删除重复元素呢?
如果你现在还没明白,那说明你还没真正理解iter = vect.erase(iter)
vect v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(1); v.push_back(3); v.push_back(1); vect::iterator iterBegin = v.begin(), iterEnd = v.end(), iterNext = iterBegin; for(; iterBegin != iterEnd; ) { if(*iterBegin == 1) { iterBegin = v.erase(iterBegin); iterEnd = v.end(); } else { ++iterBegin; } }
for(iterBegin = v.begin(); iterBegin != v.end(); ++iterBegin) { printf("%d ", *iterBegin); }
答案:自己敲吧(不明白的人当然也是没有动手能力的,机会来了)
很显然 假如我不是固定删除1,而是动态删除重复的元素,那么隐患就来了
因为业务数据复杂,考虑维护性最后没用多重循环,用了key做临时缓存比对删除重复元素