程序员面试宝典上有这样一道题:以下代码有什么错,如何修改?(中国某软件公司2005年面试题)
#include <iostream> #include <vector> using namespace std; void PrintVec(vector<int> V) { vector<int>::iterator iter; cout<<V.size()<<endl; for (iter=V.begin();iter!=V.end();iter++) { cout<<*iter<<" "; } cout<<endl; } int main() { vector<int> Vec; Vec.push_back(1); Vec.push_back(2); Vec.push_back(4); Vec.push_back(8); Vec.push_back(8); Vec.push_back(16); vector<int>::iterator iter1; vector<int>::iterator iter2; for (iter1=Vec.begin();iter1!=Vec.end();) { if (8==*iter1) { iter2=iter1; Vec.erase(iter2); } iter1++; } PrintVec(Vec); system("pause"); return 0; }
问题的关键就是在删除“8”之后,指针还是会停留在“8”的位置,而这时候“8”已经从Vec中移除,所以,再往后移是错误的。因此,需要在移除“8”之前把iter1移到4的位置。这也就需要iter--。书上给出了这样的答案:
View Code
#include <iostream> #include <vector> using namespace std; void PrintVec(vector<int> V) { vector<int>::iterator iter; cout<<V.size()<<endl; for (iter=V.begin();iter!=V.end();iter++) { cout<<*iter<<" "; } cout<<endl; } int main() { vector<int> Vec; Vec.push_back(1); Vec.push_back(2); Vec.push_back(4); Vec.push_back(8); Vec.push_back(8); Vec.push_back(16); vector<int>::iterator iter1; vector<int>::iterator iter2; for (iter1=Vec.begin();iter1!=Vec.end();iter1++;) { if (8==*iter1) { iter2=iter1; Vec.erase(iter2); iter1--; } } PrintVec(Vec); system("pause"); return 0; }
但是,在vs中测试会发现,其实,这段代码是错误的,原因就在于:移除“8”之后,这个指针已经被删除,而这时候iter1和iter2都已经不属于Vec了,因此,必须要在指针被删除之前就讲iter1的位置往前移:
View Code
#include <iostream> #include <vector> using namespace std; void PrintVec(vector<int> V) { vector<int>::iterator iter; cout<<V.size()<<endl; for (iter=V.begin();iter!=V.end();iter++) { cout<<*iter<<" "; } cout<<endl; } int main() { vector<int> Vec; Vec.push_back(1); Vec.push_back(2); Vec.push_back(4); Vec.push_back(8); Vec.push_back(8); Vec.push_back(16); vector<int>::iterator iter1; vector<int>::iterator iter2; for (iter1=Vec.begin();iter1!=Vec.end();iter1++) { if (8==*iter1) { iter2=iter1; iter1--; Vec.erase(iter2); } } PrintVec(Vec); system("pause"); return 0; }