昨天,我写了一个multiset去重,让tt指向it的后面第一个元素,若重复则删除这2个元素,并令it=tt,it++;来使it指向tt的下一个元素(我想指向原it的后面第2个元素,并认为tt的下一个元素就是原it的后面第2个元素)

 #include<iostream>
 #include<cstdio>
 #include<set>
 using namespace std;

 typedef long long ll;
 multiset<ll> s;
 multiset<ll>::iterator it;
 multiset<ll>::iterator tt;

 int main()
 {
     ll t,n,in;
     cin >> t;
     while (t--)
     {
         s.clear();
         cin >> n;
         ; i<=n; i++)
         {
             cin >> in;
             s.insert(in);
         }

         for(it = s.begin(); it != s.end() && tt != s.end();)
         {
             tt=it;
             tt++;
             if(it == s.end() || tt == s.end())break;
             if(*it == *tt)
             {
                 s.erase(it);
                 s.erase(tt);
                 it = tt;
                 it++;
             }
             else
             {
                 it=tt;
             }
         }
         it = s.begin();
         tt = it;
         tt++;
         printf("%lld %lld\n",*tt,*it);

     }
 }

然而去重失败了

接着我尝试输出每次检测到的元素,发现当检测到2 2后,下一次检测到的是3 4,也就是说程序跳过了3 3.

于是我尝试查看迭代器的地址,发现出现了下面这种情况

(我给ii迭代器模拟it迭代器的情况)

tt指向it后面的一个元素,也就是tt=it;tt++;然后删除元素时,我将ii=tt;ii++;

这时每当ii++时,它的地址从48->88->a8(168),但如果写成it++;it++;的话,it的地址是从28->08->68的,第一个3在68那,但如果是我原来写的方法,这时就访问的到了88,也就是第2个3的位置,也就是跳过了一个元素。

当ii=tt;ii++;后ii指向的不是第一个3,但2次i++后的却是第一个3,这是否和multiset的数据结构有关?

如果是2次i++后结果是正确的

 #include<iostream>
 #include<cstdio>
 #include<set>
 using namespace std;
 ;
 typedef long long ll;
 multiset<ll> s;
 multiset<ll>::iterator it;
 multiset<ll>::iterator tt;
 multiset<ll>::iterator ii;
 int main()
 {
     ll t,n,in;
     cin >> t;
     while (t--)
     {
         s.clear();
         cin >> n;
         ; i<=n; i++)
         {
             cin >> in;
             s.insert(in);
         }

         for(it = s.begin(); it != s.end() && tt != s.end();)
         {
             tt=it;
             tt++;
             if(it == s.end() || tt == s.end())break;
             if(*it == *tt)
             {
                 s.erase(it);
                 s.erase(tt);
                                  it++;
                 it++;
             }
             else
             {
                 it=tt;
             }
         }
         it = s.begin();
         tt = it;
         tt++;
         printf("%lld %lld\n",*tt,*it);
     }
 }

multiset的erase()操作中出现跳过元素的问题的更多相关文章

  1. multiset容器erase函数的误用

    <从缺陷中学习C/C++>第3章库函数问题,本章主要介绍库函数的使用中会遇到的问题.使用库函数可以降低软件开发的难度,提高代码编写的效率.本节为大家介绍multiset容器erase函数的 ...

  2. python删除数组元素导致跳过元素

    复现的情况大概可以写成这样 abc = [1, 2, 2, 3, 4] print abc for index, i in enumerate(abc): if i == 2: del abc[ind ...

  3. js 在array的遍历操作中修改arry中元素数量 出现的一些奇特的操作

    在js中array是属于复杂类型,在arr1=arr2得赋值操作中,arr1得到的值并不是arr2的value,而是一个指向引用.那么修改arr1的同时arr2读取的值也会同步变化,那么问题来了,上代 ...

  4. STL中用erase()方法遍历删除元素 .xml

    pre{ line-height:1; color:#f0caa6; background-color:#2d161d; font-size:16px;}.sysFunc{color:#e54ae9; ...

  5. STL中用erase()方法遍历删除元素

    STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector .deque):另一类是以不连续的节点形式存储的容器(如:list.set.map).在使用erase方法来删除元素时 ...

  6. deque源码4(deque元素操作:pop_back、pop_front、clear、erase、insert)

    deque源码1(deque概述.deque中的控制器) deque源码2(deque迭代器.deque的数据结构) deque源码3(deque的构造与内存.ctor.push_back.push_ ...

  7. STL的erase()陷阱-迭代器失效总结

    下面材料整理自Internet&著作. STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector .deque):另一类是以不连续的节点形式存储的容器(如:list.s ...

  8. C++ Set & MultiSet

    转自http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177627.html STL Set介绍集合(Set)是一种包含已排序对象的关联容器 ...

  9. [STL]set/multiset用法详解[自从VS2010开始,set的iterator类型自动就是const的引用类型]

    集合 使用set或multiset之前,必须加入头文件<set> Set.multiset都是集合类,差别在与set中不允许有重复元素,multiset中允许有重复元素. sets和mul ...

随机推荐

  1. Java开发知识之Java中的泛型

    Java开发知识之Java中的泛型 一丶简介什么是泛型. 泛型就是指泛指任何数据类型. 就是把数据类型用泛型替代了. 这样是可以的. 二丶Java中的泛型 Java中,所有类的父类都是Object类. ...

  2. 如何用sysbench做好IO性能测试

    sysbench 是一个非常经典的综合性能测试工具,通常都用它来做数据库的性能压测,但也可以用来做CPU,IO的性能测试.而对于IO测试,不是很推荐sysbench,倒不是说它有错误,工具本身没有任何 ...

  3. 离线批量数据通道Tunnel的最佳实践及常见问题

    基本介绍及应用场景 Tunnel是MaxCompute提供的离线批量数据通道服务,主要提供大批量离线数据上传和下载,仅提供每次批量大于等于64MB数据的场景,小批量流式数据场景请使用DataHub实时 ...

  4. github总结(4)--关于git reset --hard这个命令的惨痛教训

    背景叙述: 前几天,上传自己的个站到git上的时候,手欠脑发晕的用了次git reset --hard xxxxxx 命令.由于只在线上传入了一个index.html页面(自己都不知道自己咋想的,就这 ...

  5. 什么是DevOps?

    一. 什么是DevOps 是什么? DevOps (英文 Development 和 Operations 的组合)是一组过程.方法与系统的统称,用于促进开发(应用程序 / 软件工程).技术运营和质量 ...

  6. windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况

    windows下查询端口占用情况 ,强制结束端口占用程序 查询8080端口被那个程序占用 如何强制结束windows下端口占用情况? 下面操作在win10下 在控制台执行命令   1.列出所有端口的情 ...

  7. windows7安装MySQL-python遇到的坑

    最近在windows环境上搭建flask使用环境,遇到过很多坑,这次就记录下安装flask-mysqldb所遇到的坑. 正常逻辑是使用pip install flask-mysqldb进行安装.但是会 ...

  8. Linux之安装常用软件

    Linux下安装软件的方法: 1,rpm(不推荐使用) 2,yum安装(使用快捷方便) 3,编译安装 一.安装python3(这里使用的是编译安装) 1,下载python3源码包 在centos下,第 ...

  9. JestClient 使用教程,教你完成大部分ElasticSearch的操作。

    本篇文章代码实现不多,主要是教你如何用JestClient去实现ElasticSearch上的操作. 授人以鱼不如授人以渔. 一.说明 1.elasticsearch版本:6.2.4 . jdk版本: ...

  10. webstorm里用 DB browser 连接 mysql SQlite Oracle数据库

    (1)插件名:DB browser preferences -> plugin -> 搜索 DB browser (2)在view里勾上 Tool Buttons,左侧会显示插件快捷入口 ...