erase()删除一个元素后 迭代器指针会自动指向下一个,不需要再手动++!!!
今天上头歌写题,作为一个学java,没怎么接触过c++的小白来说,这道非常简单的题令我百思不得其解,吃了没学过c++STL的亏。题目如下:
编程要求
本关的编程任务是补全右侧代码片段main
中Begin
至End
中间的代码,具体要求如下:
- 创建一个整型类型的向量
vec
; - 读取数据:序列个数
n
,以及n
个整数并插入向量vec
; - 通过
erase
操作删除向量vec
中的重复元素:保留第一次出现的元素,删除之后出现的重复元素; - 使用
Algorithm
模板函数sort
对向量vec
里的元素从小到大排序; - 遍历向量
vec
并输出:元素中间空格隔开,末尾加换行符\n
; - 调用
clear
清空向量。
测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
以下是平台的测试样例:
测试输入: 7
1 2 3 1 2 3 4
预期输出: 1 2 3 4
0
输入格式: 第一行:序列个数n
第二行:n个整数序列
输出格式: 第一行:遍历并输出向量,中间空格隔开,末尾换行\n
第二行:非学员输出,数值0用于检测向量是否清空
题目大致意思就是教你使用STL里面的vector,其他操作没什么问题,主要问题出现在删除重复元素这里
一开始我写的代码如下:
思路非常简单,直接用一个二重循环查找搞定;但是出现了下面这种情况
当数组中元素全部相同时,会删不干净。一开始以为逻辑出了问题,debug了半天,结果发现是没注意到vector的erase()方法的一个坑:
使用earse(iterator positon)删除一个元素之后,形参指针已经指向了被删除元素的下一个元素,再进行it2++会跳过下一个元素,
也就是说删除一个元素后 迭代器指针会自动指向下一个,不需要再手动++!!!
于是修改代码如下:(顺利AC)
红色划线部分为修改的地方