又一道关于STL中的vector容器的面试题

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:09   3166   0

这次是一条找错题,我们有如下代码:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
 typedef vector IntArray;
 IntArray array;
 array.push_back(1);
 array.push_back(2);
 array.push_back(2);
 array.push_back(3);
 for(IntArray::iterator itor = array.begin(); itor != array.end(); ++itor)
 {
  if(2 == *itor)
   array.erase(itor);
 }
 return 0;
}

问:这个代码能否正确得到我们期待的结果(删除容器中的值为2的项)?

首先,这个代码是不能编译通过的,原因是typedef vector IntArray这句没有指明容器的数据类型,应更改为typedef vector<int> IntArray。。

其次,这个代码对于连续的两个2,只能删除一个,因为erase()方法执行后,后面的元素会自动向上移动一个单位,此时如果itor没有及时回退的话,就会miss掉一个元素,我们作如下修改:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
 typedef vector<int> IntArray;
 IntArray array;
 array.push_back(1);
 array.push_back(2);
 array.push_back(2);
 array.push_back(3);
 for(IntArray::iterator itor = array.begin(); itor != array.end(); ++itor)
 {
  if(2 == *itor)
  {
   array.erase(itor);
   itor--;
  }
 }
 return 0;
}

此时就可以得到我们期望的结果了。。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP