std::vector
场景:
1.std::vector需要根据条件删除特定的元素。
2.std::vector的iterator在删除后这个iterator是失效的,所以不能直接++iter,这时候只能取erase的返回值下一个iterator作为有效的iter使用.
#include <stdio.h> #include <assert.h> #include <vector> typedef struct closure closure; struct closure { int isAllow; }; int main(int argc, char *argv[]) { std::vector<closure*> infos; closure c1; c1.isAllow = 1; closure c2; c2.isAllow = 0; closure c3; c3.isAllow = 1; closure c4; c4.isAllow = 0; closure c5; c5.isAllow = 0; infos.push_back(&c1); infos.push_back(&c2); infos.push_back(&c3); infos.push_back(&c4); infos.push_back(&c5); printf("begin delete\n"); std::vector<closure*>::iterator iter; for(iter = infos.begin();iter != infos.end();) { closure* c = *iter; if(c->isAllow) { iter = infos.erase(iter); }else { ++iter; } } printf("end delete %d\n",infos.size()); for(iter = infos.begin();iter != infos.end();++iter) { closure* c = *iter; assert(!c->isAllow); } printf("end list left.\n"); return 0; }
输出:
begin delete end delete 3 end list left.