关于c++ vector erase的实践

先来看个例子:

 1 void display(vector<CTemp> vTemp)
 2 {
 3   for(unsigned int i = 0; i < vTemp.size(); i++)
 4   {
 5     cout << vTemp[i].getId() << ":" << vTemp[i].getType() << endl;
 6   }
 7   cout << "size:" << vTemp.size() << endl;
 8 }
 9 
10 int main() {
33   vector<CTemp> vCtemp;
34   for(int i = 0; i < 10; i++)
35   {
36     CTemp temp1;
37     temp1.setId(i);
38     temp1.setType("int");
39     vCtemp.push_back(temp1);
40   }
41   display(vCtemp);
42 
43   for(vector<CTemp>::iterator it=vCtemp.begin();it!=vCtemp.end();)
44   {
45     if(it->getId() ==4 || it->getId() == 9)
46     {
47       cout << "before erase:" << it->getId() << " size:" << vCtemp.size() <<  endl;
48       vCtemp.erase(it);
49       //it=vCtemp.erase(it);结果是一样的,删除一个元素后,原来后边的元素向前移动,补上被删除掉的元素的位置,但内存是不释放的.
50 
51       if(it != vCtemp.end()) //这句注掉,会发现最后打印出的id还是9,说明内存没有释放,
52                              //最后it还是指向最后被删除的位置,它的值还存在。只是此时it的位置已经算是end了
53       {
54         cout << "after erase:" << it->getId() << " size:" << vCtemp.size() <<  endl;
55       }
56     }
57     else
58     {
59       it++;
60     }
61   }
62   cout << "vCtemp.end():" << vCtemp.end()->getId() << endl;
63   display(vCtemp);
64 
65     return 0;
66 }

程序执行的结果如下:
0:int
1:int
2:int
3:int
4:int
5:int
6:int
7:int
8:int
9:int
size:10
before erase:4 size:10
after erase:5 size:9
before erase:9 size:9
vCtemp.end():9
0:int
1:int
2:int
3:int
5:int
6:int
7:int
8:int
size:8

如果将第51行注掉,则执行结果如下:

0:int
1:int
2:int
3:int
4:int
5:int
6:int
7:int
8:int
9:int
size:10
before erase:4 size:10
after erase:5 size:9
before erase:9 size:9
after erase:9 size:8
vCtemp.end():9
0:int
1:int
2:int
3:int
5:int
6:int
7:int
8:int
size:8

 

posted @ 2013-11-12 16:15  莱格拉斯  阅读(253)  评论(0)    收藏  举报