首页 > 试题广场 >

下面这个代码输出的是()

[单选题]
#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(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 300  300 500
  • 100 3OO 300 300 500
  • 100 300 300 500
  • 100 300 500
  • 100 500
  • 程序错误
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素
vector::erase()方法有两种重载形式
如下:
iterator erase(   iterator _Where);
iterator erase(   iterator _First,   iterator _Last);
如果是删除指定位置的元素时:
返回值是一个迭代器,指向删除元素下一个元素;
如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;

在本题中,当 *itor==300成立时,删除第一个值为300的元素,同时itor指向下一个元素(即是第二个值为300的元素),
                            在for(;;itor++)执行itor,itor指向第三个值为300的元素,进入下一个循环
         进入循环满足*itor==300,重复上面的过程,执行完循环,itor执行值为500的元素。
所有整个过程中,只删除了2个值为300的元素。
发表于 2016-05-06 17:18:57 回复(14)

正确的写法应该是:

for(iter = array.begin(); iter != array.end(); )//将递增放在函数体中

{
    if(*iter == 300)
        iter = erase(iter);
    else
        ++iter;
}
发表于 2018-01-10 15:07:02 回复(3)
*itor==300成立时,删除第一个值为300的元素,同时itor指向下一个元素(即是第二个值为300的元素),然后执行itor++,下滑到下一个值
                             itor指向第三个值为300的元素,然后进入下一个循环删除第4行的300,然后跳到500,然后打印
         
发表于 2016-05-08 20:56:49 回复(2)
注意for循环中的itor++,因此这一题并不能把300全部删除。erase返回的是指向删除元素下一个元素的迭代器。
发表于 2016-07-29 22:35:25 回复(0)
补充一下:在for,while中利用容器的insert,erase方法可能会引发迭代器失效,在本题中如果再添加一条array.push_back(300);则程序出错,原因是itor超出 array.end()范围
发表于 2016-07-13 16:56:47 回复(0)
erase函数指的是删除容器某个位置的数据,且该函数返回值指向下一个位置,因此第一个300==*itor,之后itor指向第二个300,然后itor++,此时itor指向第三个300,第二个300没有被删除。重复第一个300的操作后,itor指向500:1.100   2.300   3.300     4.300     5.300     6.500 
发表于 2018-03-11 19:46:06 回复(0)
由于每次调用array.erase(itor)之后,被删除元素之后的内容会自动往前移,导致迭代漏项
发表于 2017-06-30 11:21:54 回复(0)
erase返回一个迭代器,指向被删除元素之后的元素。 
发表于 2018-03-30 20:56:16 回复(0)
erase删除后会返回一个
iterator,它指向被删除的下一个元素,但是for循环中又++了,所以会指向下下一个元素,导致越过一个元素
发表于 2023-03-20 11:32:50 回复(0)
多加了一次
发表于 2023-11-05 20:42:38 回复(0)
itor=array.erase(itor)  执行erase后返回的迭代器itor指向下一个元素,然后for循环中itor++即中间跳过一个元素
发表于 2022-07-17 16:29:27 回复(0)
这个题考的是erase的一个易错点,当erase删除一个(或一个范围内)的元素后,会指向被删除的下一个元素,相当于隐式包含了++运算。
发表于 2022-01-15 08:26:58 回复(0)
iterator erase(   iterator _Where); 如果是删除指定位置的元素时: 返回值是一个迭代器,指向删除元素下一个元素; 对注意是下一个元素 所以在用迭代器遍历时,如果用了erase删除了最后一个元素 因为迭代器iter此时明明在最后一个元素的位置,但是因为被erase删了,所以指向下一个位置就是end,然后++end就报错了
发表于 2021-10-30 23:00:32 回复(0)
erase原来放回的是下一个元素的位置,那么300就只是删除2次而已~
发表于 2021-05-17 18:22:00 回复(0)
执行vector::erase(itor)后,删除当前指向的元素并且itor自动指向了下一个元素
编辑于 2021-01-29 23:38:52 回复(0)

删除元素后,迭代器会自动加一,再用循环里面的加一操作,所以4个300只删除了2个


发表于 2020-02-11 22:42:28 回复(0)
 erase函数 返回的是尾后迭代器
发表于 2020-01-16 15:37:47 回复(0)
理解vector::erase()即可
发表于 2019-05-05 17:15:47 回复(0)
erase函数删除后会返回删除节点的下一个节点,所以实际上只删除了两个节点
发表于 2018-09-30 14:49:41 回复(0)
问题是 修改了vector的元素 原始迭代器还能用?
发表于 2018-01-22 01:15:18 回复(0)