标签:
之前看《C++ Primier》的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究。今天写程序的时候遇到了这个问题。
最初我的程序是酱紫的,别说话,我知道这样是有问题的,可这样是最直观的想法
vector<int> a; for (int i = 0; i < 10; ++i) { a.push_back(i); } for (auto it = a.begin(); it != a.end();++it ){ if (*it == 5){ a.erase(it); } }
没错,程序崩溃!删除了迭代器it之后,it迭代器失效了,无法再进行++it操作了。
查了书,发现书中说it之前的迭代器是有效的。于是,机智如我:
vector<int> a; for (int i = 0; i < 10; ++i) { a.push_back(i); } for (auto it = a.begin(); it != a.end();++it ){ if (*it == 5){ auto it1 = it; --it; a.erase(it1); } }
BlingBling! 机智不机智?我就问你,机智不机智?在删除5之前,我已经让it指向4了,这样,删除5之后,++it使得it指向了6,新的迭代器!
机智如我,自然会去探索一下insert之后,迭代器会怎样。于是:
vector<int> a; for (int i = 0; i < 10; ++i) { a.push_back(i); } for (auto it = a.begin(); it != a.end(); ++it){ if (*it == 5){ a.insert(it, 100);
++it; } }
你猜怎么着??
啥事儿没有!你可能会问,插入之后为什么要++it。插入之前,it指向5,在5之前插入100后,it指向100。这样下一次循环,it依然会指向5。相信我,你的程序会爆炸的!
我作了个++it之后,it又指向5,下一次循环就直接指向5之后的元素了,顺利完成插入工作。
世界和平~世界和平~我还真不确定。
突然想到,当插入元素过多,vector的capacity会增加,这时会不会问题呢?说干就干:
vector<int> a; for (int i = 0; i < 13; ++i) { a.push_back(i); } for (auto it = a.begin(); it != a.end(); ++it){ if (*it == 5){ a.insert(it, 100); ++it; } }
为什么是13?因为我调试一下,VS就告诉我这个vector的capacity了。
BOOM!果然崩溃了!也就是说插入之后的迭代器失效了。那之前的呢?
我决定粗暴地测试一下:
vector<int> a; for (int i = 0; i < 13; ++i) { a.push_back(i); } for (auto it = a.begin(); it != a.end(); ++it){ if (*it == 5){ a.insert(it, 100); it=a.begin(); } }
我插入之后,直接让it指向begin(),然后单步调试。执行完it=a.begin()还好好的,可再去执行++it还是崩溃了。
也就是说,capacity变化之后,所有的迭代器都失效了!太恐怖。我不敢下结论。
愈发觉得有必要看看《STL源码剖析》了……
标签:
原文地址:http://www.cnblogs.com/qiaoconglovelife/p/5370396.html