第一种写法:

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int>v;v.push_back(888);v.push_back(89);v.push_back(89);v.push_back(89);v.push_back(9999);v.push_back(89);for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++){if (*it != 9999){v.erase(it);}}for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << endl;}return 0;
}

该写法存在很大问题,erase函数返回的结果是指向被删除元素的下一个元素的迭代器,在这里:

v.erase(it);

并没有拿我们的迭代器it去接收这个返回值,故执行第一次erase函数,将888删除后,迭代器it的位置就不知道去哪里了,就会报以下错误!


正确写法应该是:

it = v.erase(it);

第二种写法

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int>v;v.push_back(888);v.push_back(89);v.push_back(89);v.push_back(89);v.push_back(9999);v.push_back(89);for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++){if (*it != 9999){it = v.erase(it);it--;}}for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << endl;}return 0;
}

直接报以下错误:

一般人认为因为erase函数返回的结果是指向被删除元素的下一个元素的迭代器,所以用了一个:

it--;

让迭代器it回到原来的位置,但是事实并没有想象中的那么简单!

因为我们不能自以为是的认为vector里的元素就是像数组那样存放,所以你觉得迭代器指向下一个位置后,可以通过it–来回到原来的位置,事实上,它回不去原来的位置,不能直接把迭代器理解成指针,所以不要使用it–。

第三种写法(正确写法)

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int>v;v.push_back(888);v.push_back(89);v.push_back(89);v.push_back(89);v.push_back(9999);v.push_back(89);for (std::vector<int>::iterator it = v.begin(); it != v.end(); ){if (*it != 9999){it = v.erase(it);}else{it++;}}for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << endl;}return 0;
}


观察上面两种图,可以看到我已经删除了几个元素89了,但迭代器的地址竟然都没有发生变化,可以看到vector内部是有优化的,所以不能直观的把vector理解为数组,迭代器理解成指针,所以不要使用it–这样的操作。

C++ vector容器中用erase函数和迭代器删除重复元素问题分析相关推荐

  1. vector容器中erase(删除)的使用

    erase函数可以用于删除vector容器中的一个或者一段元素,在删除一个元素的时候,其参数为指向相应元素的迭代器,而在删除一段元素的时候,参数为指向一段元素的开头的迭代器以及指向结尾元素的下一个元素 ...

  2. C++ vector容器 find erase的使用:查找并删除指定元素

    概念:容器.迭代器.算法 STL包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的优缺点,不同的容器反映出程序设计的不同需求.容器自身可能由数组或链表实现,或者容器中的每个元 ...

  3. C++【vector容器模拟实现函数解析】

    文章目录 vector容器&&模拟实现函数解析 一.vector介绍使用 二.vector 迭代器失效问题 三.vector容器模拟实现及函数解析 3.1vector构造函数指针初始化 ...

  4. stl vector 函数_在C ++ STL中使用vector :: begin()和vector :: end()函数打印矢量的所有元素...

    stl vector 函数 打印向量的所有元素 (Printing all elements of a vector) To print all elements of a vector, we ca ...

  5. erase() 返回的是删除此元素之后的下一个元素的迭代器 .xml

    比如: 我写的一个程序中,要删除某个位置的元素 for(list<list<tag_Point>>::iterator pos=point_to_file_list.begin ...

  6. 牛客网_PAT乙级_1022挖掘机技术哪家强(20)【class vector sort排序、删除重复元素】

    题目描述 为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入描述: 输入在第1行给出不超过105的正整数N,即参赛人数.随后N行,每 ...

  7. c语言的erase函数,[转] C++ STL中map.erase(it++)用法原理解析

    总结一下map::erase的正确用法. 首先看一下在循环中使用vector::erase时我习惯的用法: for(vector::iterator it = vecInt.begin(); it ! ...

  8. c++ hashset的用法_c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例

    c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...

  9. STL之Vector容器

    一.初识Vector容器 学习目标1:学会往Vector容器中添加内置数据类型和Vector容器的遍历 示例: #include "iostream" #include <v ...

最新文章

  1. 在FreeBSD下安装mysql+apache+php
  2. android开发系列之数据存储
  3. 1 图片channels_【深度学习】卷积神经网络图片分类案例(pytorch实现)
  4. VTK:可视化之TextSource
  5. 2016网络安全***赛记录
  6. java 内存模型6_深入理解Java内存模型(六)——final
  7. dsm php,docker dsm是什么?
  8. Retroifit原理
  9. UINavigationBar的系统渲染方式
  10. songEagle开发系列:如何让文章实时保存的问题
  11. 聊聊flink JobManager的heap大小设置 1
  12. 系统检测到您正在使用网页抓取工具访问_网站如何检测被爬虫?
  13. C语言strcmp函数使用及模拟
  14. 【分享】这款微信电子名片真的很值得拥有!
  15. 计算机hp1007打印程序,HP P1007
  16. 2022年河北二级建造师建设工程施工管理《施工合同管理》练习及答案
  17. f4menu2----Total Commander 增强型F4插件
  18. Unity限制InputField输入数字
  19. linux etc目录讲解
  20. 计算机与艺术传媒用英语怎么说,经济学人:艺术评论和计算机 数字图画

热门文章

  1. 【ArcGIS风暴】ArcGIS矢量数据分层设色后导出或裁剪后颜色分类丢失完美解决办法
  2. 《Matlab实用案例》系列Matlab从入门到精通实用100例案例教程目录(持续更新)
  3. C语言试题三十六之将s所指字符串中所有下标为奇数位置上的字母转换为大写(若该位置上不是字母,则不转换)。
  4. 均分纸牌(经典贪心)
  5. 链表之单链表约瑟夫问题(二)
  6. android log.d 格式化,android – 在我的代码中使用Log.d()或Log.e()
  7. html点击关闭代码,怎样开放和关闭html代码?
  8. 两个简单多边形面积相等,那么其中一个能分割成有限多块多边形,经过平移和旋转,拼合成第二个多边形...
  9. MATLAB图像处理与数字信号处理资料分享来袭
  10. 计算机老师开场白试讲视频,教师招考试讲模版之开场白