首页 > 试题广场 >

下列代码的输出结果为什么?

[单选题]
下列代码的输出为:
#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
  • 程序错误
推荐
vector erase以后,itor已经指向下一个元素了,不应该执行itor++,
否则会跳过下一个元素,即连续两个300时跳过了第二个300. 

正确代码应该是
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<<" ";  
    }  
    return 0;  
}  
参考文献:
http://blog.csdn.net/dgyanyong/article/details/21268469


编辑于 2015-02-09 15:38:54 回复(8)

在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结。

1 基本操作

(1)头文件#include<vector>.

(2)创建vector对象,vector<int> vec;

(3)尾部插入数字:vec.push_back(a);

(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。

(5)使用迭代器访问元素.

vector<int>::iterator it; for(it=vec.begin();it!=vec.end();it++)
    cout<<*it<<endl;

(6)插入元素:    vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;

(7)删除元素:    vec.erase(vec.begin()+2);删除第3个元素

vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始

(8)向量大小:vec.size();

(9)清空:vec.clear();

发表于 2017-02-13 17:45:31 回复(1)
erase(itor)删除元素后,本来就是返回的是下一个迭代器的地址(第二个300的地址),然而在执行完后for循环中又进行itor++操作,故当前指针指向500的地址,所以只删除了一个300.
发表于 2016-08-27 10:29:10 回复(0)
erase函数的返回值,返回删除迭代器的下一个位置;相当于擦除当前指向的对象,后面的记录往前移动一格
发表于 2015-08-22 10:38:35 回复(0)
VS2012 
发表于 2016-01-27 11:47:32 回复(1)
擦除第一个300后,数组中元素变为3个,而此时遍历下标变为2,此时即为500,对第二个300未进行处理
发表于 2015-09-09 11:25:20 回复(0)
不太满意前面的答案,itor = array.erase(itor);确实失效了原来的itor,但是erase返回了新的itor,这个新的itor指向300。
所以虽然删除了第一个300,但是确保留了第二个300。
最后打印出来 100 300 500

具体需要看erase函数的特性:


注意that followed~~,如果是that was followed by 或者 following意思就不一样了~
发表于 2018-05-04 11:18:49 回复(0)
在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结。 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<int> vec; (3)尾部插入数字:vec.push_back(a); (4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。 (5)使用迭代器访问元素. vector<int>::iterator it; for(it=vec.begin();it!=vec.end();it++) cout<<*it<<endl; (6)插入元素:    vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a; (7)删除元素:    vec.erase(vec.begin()+2);删除第3个元素 vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-i];区间从0开始 (8)向量大小:vec.size(); (9)清空:vec.clear();
发表于 2018-04-10 17:04:00 回复(0)
这里只需要了解erase()函数返回的是删除的itor的后面一个迭代器,就能理解了。
发表于 2018-01-20 18:03:18 回复(0)

it = array.erase(itor);这一句迭代器自动加一

该程序改为:

#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)
        {
            it = array.erase(itor);
        }
        else{
            itor++;
        }
    }  
    for(itor=array.begin();itor!=array.end();)  
    {  
        cout<<*itor<<" ";  
    }  
    return0;  
}
编辑于 2017-12-09 19:19:54 回复(0)
容器vector调用erase()函数,返回的是删除迭代器的下一个,因此跳过了相邻的300.
发表于 2017-03-10 20:14:53 回复(0)
需要注意erase函数的返回值,返回删除迭代器的下一个位置。
发表于 2015-02-16 21:28:19 回复(0)
这题选c,程序运行得到
发表于 2019-07-23 16:20:01 回复(0)
vector在erase之后,指向下一个元素的位置,其实进行erase操作时将后面所有元素都向前移动,迭代器位置没有移动。itor=array.erase(itor) erase返回下一个元素的地址,相当于给itor一个新值。
发表于 2019-04-28 20:57:11 回复(0)
又眼瞎了
发表于 2018-09-15 21:19:50 回复(0)
发表于 2018-05-22 15:09:13 回复(0)
 while(*itor==300)   //将if改为while即可解决无法删除连续相同元素的问题
        {  
            itor = array.erase(itor);  
        }  

发表于 2018-03-20 18:51:33 回复(0)
迭代器
发表于 2018-01-22 14:10:56 回复(0)
Erase 后,返回下一个元素的位置,迭代器接受后又++后就跳过了第二个300
发表于 2017-07-24 19:01:59 回复(0)
为什么eraser之后返回的是下一个迭代器呢?想一想也觉得有道理,这样子,就算全部删掉了,也还可以返回尾后迭代器。要是返回前一个迭代器,删了头部或者全部删光了怎么办呢?抛异常吗?
发表于 2017-06-19 18:15:09 回复(0)
我***了
发表于 2017-05-10 13:12:37 回复(0)