首页 > 试题广场 >

下列代码编译运行后的结果是() vector<int

[单选题]

下列代码编译运行后的结果是()

vector<int> vecNum{3,1,2,3,5,4};
auto iter = vecNum.begin();
while (iter != vecNum.end())
{
    if (3 == *iter)
        vecNum.erase(iter);
    ++iter;
}
 
iter = vecNum.begin();
while (iter != vecNum.end())
{
    std::cout << *(++iter);
}

  • 12354

  • 125
  • 1254
  • 编译成功运行异常

迭代器失效?

发表于 2020-02-15 14:33:14 回复(0)
对vector.erase()的一些补充:
删除后,返回指向删除元素的下一个位置的迭代器。这里的下一个位置指的是下一个元素,但是下一个元素向前挪动了,所以返回的迭代器还是指向本位置。
可以通过下面一段代码查看:
int main()
{
    int a[] = {1,2,3,3,4,5,6,3};
    vector<int> ivec(a,a+8);

    for(vector<int>::iterator it=ivec.begin();it!=ivec.end();){
        if((*it) == 3) {
             cout<<"删除之前地址:"<<&*it<<endl;
            it=ivec.erase(it);
             cout<<"删除之后地址:"<<&*it<<endl;// 删除前和删除后地址不变,说明只是元素前移,迭代器不移动
        }
        else it++;
    }
    cout<<"删除之后vector尾元素地址:"<<addressof(*ivec.end())<<endl;// 获取迭代器地址的方式二
    return 0;
}

发表于 2021-03-27 09:37:25 回复(0)
首先看下erase的解释和用法:
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 
vector::erase()方法有两种重载形式 
如下: 
iterator erase(   iterator _Where); 
iterator erase(   iterator _First,   iterator _Last); 
如果是删除指定位置的元素时: 
返回值是一个迭代器,指向删除元素下一个元素; 
如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;

此时我们再看代码:
while (iter != vecNum.end())
{
    if (3 == *iter)
        vecNum.erase(iter);
    ++iter;
}
vecNum.erase(iter);执行完毕后,iter指向的值被删除,iter也被释放。因此接下的  ++ iter 会在执行的时候报错导致程序崩溃。因为iter此时是无指向的。

正确修改代码如下:

while(iter != vecNum.end())
{
    if(3== *iter)
        
      iter=vecNum.erase(iter); //我们将erase的返回值赋给iter,则程序正常执行。
    ++iter; }








发表于 2020-03-12 10:16:47 回复(3)
最后这个输出++iter是不是会越界?
发表于 2020-02-12 21:34:51 回复(6)
g++ (Debian 9.2.1-28) 9.2.1 20200203
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

g++环境下,答案是2544. 
此处由于没有push_back元素,不会导致vector重新分配内存。指针是不会失效的。
到最好一步,vecNum中剩下的元素是:1254(44)。只有1254是可见的。
后面两个(44)是在end()之外的,vector不提供接口访问,但是可以通过指针移动直接访问
由于是iter=vecNum.begin() 。下面的iter是前++。所以打印的是iter靠后的一位。
*(++iter)
所以答案是2544.
提供的答案里,没有正确答案。


发表于 2020-02-18 20:54:54 回复(2)