首页 > 试题广场 >

下列代码的输出为?

[单选题]
下列代码的输出为:
#include<iostream>
#include<vector>
using namespace std;

int main(void){
    vector<int>array;
    array.push_back(100);
    array.push_back(300);
    array.push_back(300);
    array.push_back(500);
    vector<int>::iterator itor;
    for (itor = array.begin(); itor != array.end(); itor++){
        if (*itor == 300){
            itor = array.erase(itor);
        }
    }
    for (itor = array.begin(); itor != array.end(); itor++){
        cout << *itor << " ";
    }
    return 0;
}

  • 100 300 300 500
  • 100 300 500
  • 100 500
  • 程序错误
推荐
B.vector 的erase函数 删除指定位置的元素时, 返回值是一个迭代器,指向删除元素下一个元素。删除第一个300后,itor指向其后的300,然后执行itor++,指向了500.
编辑于 2015-02-05 17:35:59 回复(7)
erase()一次只删除一个元素,返回一个迭代器指针,指向下一个元素。本题中,删除第一个300后,itor指向其后一个300,再通过itor++就指向了500.
做题时一定要注意分析。
发表于 2016-05-24 16:57:12 回复(1)
首先得明白vector 的 erase函数:
         删除指定位置的元素时,   返回值是一个迭代器,指向删除元素下一个元素。所以 itor = array.erase(itor);删除了元素300后,指向第二个300,还要执行itor++,此时指向了500.
编辑于 2017-07-02 11:37:42 回复(0)
vector删除元素之后的迭代器都应该失效了才对,为什么程序不报错?不理解
发表于 2016-08-08 10:47:08 回复(5)
vector中使用一次erase()方法后,原来的容器会被新的容器所取代,现在的容器指针指向的是一个野指针,所以需要重新对容器指针进行赋值操作:itor=array.begin();,添加这条语句后就可以完全去掉两个300元素
发表于 2016-07-17 10:59:16 回复(2)
总是在C题里面塞C++的题,能不能用点心啊???
发表于 2023-06-23 13:46:59 回复(0)
在第一个循环内,通过迭代器将array中的元素删除之后,迭代器指向的是被删元素的下一个,在进行了一次itor++操作之后,指向了被删除元素的后边第二个。所以此循环中有一个“300”没有被删掉。
发表于 2015-09-23 18:25:56 回复(0)
第一次执行完itor = array.erase(itor)后,第一个300被删除,itor指向被删除的下一个位置,也就是300那个位置,然后执行for循环里的itor++,指向了500那个位置,所以只删除了一个300
发表于 2015-07-24 11:58:35 回复(0)
这个虽然比较简单,倒是还是容易出错,因为erase以后在for循环中又执行了++操作
发表于 2015-07-01 11:35:19 回复(0)
if(*itor ==300)
{
    itor = array.erase(itor);
}
array.erase(itor);返回的是下一个元素的地址,在for循环中被++,即已经跳过了下一个元素的检测,应改为:
if(*itor ==300)
{
    itor = array.erase(itor);
    itor--;
}
发表于 2020-01-22 15:02:17 回复(0)
第一次执行完itor = array.erase(itor)后,第一个300被删除,itor指向被删除的下一个位置,也就是300那个位置, 然后执行for循环里的itor++,指向了500那个位置,所以只删除了一个300
发表于 2022-08-16 19:41:31 回复(0)
erase返回的是下一个元素的位置,然而,循环里面又有下一次迭代(++),所以只会删除一个300
发表于 2021-06-05 07:26:13 回复(0)
最后那个循环是输出的意思,不懂这个格式,哈哈哈,只学C语言还是不行啊哈哈
发表于 2020-11-12 02:09:06 回复(0)
100 300(2) 500
发表于 2020-05-04 09:55:39 回复(0)
本题当执行erase()函数后删除第一个300后,将指向第二个300,由于for循环中有itor++,故再次进入for循环时,itor是指向500的。按照题目的写法,无论300后的元素为何值,其后元素都将由于erase()函数被跳过,这是因为erase函数的返回值是一个指向被删除元素的下一个元素的迭代器。
若将程序改为如下形式,答案将为100 500
#include<iostream>
#include<vector>
using namespace std;

int main(void)
{
    vector<int>array;
    array.push_back(100);
    array.push_back(300);
    array.push_back(300);
    array.push_back(500);
    vector<int>::iterator itor;
    for (itor = array.begin(); itor != array.end();)
    {
        if (*itor == 300)
        {
            itor = array.erase(itor);
        }
        else itor++;
    }
    for (itor = array.begin(); itor != array.end(); itor++)
    {
        cout << *itor << " ";
    }
    
    getchar();
    return 0;
}

发表于 2019-07-02 15:14:39 回复(0)