您的位置:首页 > 职场人生

《程序员面试宝典》错题之——STL模板与容器

2020-02-18 08:25 183 查看

程序员面试宝典上有这样一道题:以下代码有什么错,如何修改?(中国某软件公司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;
}

转载于:https://www.cnblogs.com/ll2008swu/archive/2012/10/07/2714193.html

  • 点赞
  • 收藏
  • 分享
  • 文章举报
anbi3773 发布了0 篇原创文章 · 获赞 0 · 访问量 68 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: