首页 > 编程语言 >c++: 迭代器失效

c++: 迭代器失效

时间:2023-12-15 21:45:36浏览次数:53  
标签:cont 迭代 iterator ++ iter erase c++ 失效

一、序列式容器

序列式容器(如 vector, deque)的迭代器删除正确的做法如下:

 1 // 在这里想把等于2的元素都删除
 2 for(auto it=q.begin();it!=q.end();)
 3 {
 4     if(*it==2)
 5     {
 6         it=q.erase(it); // 这里会返回指向下一个元素的迭代器,因此不需要再自加了
 7     }
 8     else
 9     {
10         it++;
11     }
12 }

 

二、链表式容器

对于链表式容器(如 list),删除当前的 iterator,仅仅会使当前的 iterator 失效,这是因为 list 之类的容器,使用了链表来实现,插入、删除一个结点不会对其他结点造成影响。只要在 erase 时,递增当前 iterator 即可,并且 erase 方法可以返回下一个有效的 iterator。

方式一:递增当前 iterator

1 for (iter = cont.begin(); it != cont.end();)
2 {
3    (*iter)->doSomething();
4    if (shouldDelete(*iter))
5       cont.erase(iter++);
6    else
7       iter++;
8 }

方式二:通过 erase 获得下一个有效的 iterator

1 for (iter = cont.begin(); iter != cont.end();)
2 {
3    (*it)->doSomething();
4    if (shouldDelete(*iter))
5       iter = cont.erase(iter);  //erase删除元素,返回下一个迭代器
6    else
7       ++iter;
8 }

三、关联式容器

例如map、set;
删除当前的iterator,仅仅会使当前的iterator失效,只要在erase失效,只要在erase时递增当前iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入、删除一个结点不会对其他结点造成影响。erase迭代器只是被删除元素的迭代器先来看一下map迭代器失效的一个例子。

问题:

for (it = m.begin(); it != m.end(); it++)
{
    if ((it->first)>5)
        m.erase(it);
}

解决问题:

方法一:

for (it = m.begin(); it != m.end(); )
{
    if (it->first==5)
        m.erase(it++);//先把iter传值到erase里面,然后iter自增,然后执行erase,所以iter在失效前已经自增了
    it++;
}

方法二:

for (it = m.begin(); it != m.end(); )
{
    if (it->first==5)
    {
      it = m.erase(it);//获得有效的迭代器
    }
    else
    {
    ++it; } }

 

标签:cont,迭代,iterator,++,iter,erase,c++,失效
From: https://www.cnblogs.com/lyx5990/p/17904219.html

相关文章

  • 【python基础之迭代器】 --- 迭代器
    title:【python基础之迭代器】---迭代器date:2023-12-1318:54:06updated:2023-12-1519:10:00description:【python基础之迭代器】---迭代器cover:https://home.cnblogs.com/u/dream-ze/【一】迭代器介绍迭代器,即用来迭代取值的工具,而迭代是重复反......
  • Linux下自动生成c++工程的UML类图
    在Qtcreator上面折腾了一两天,也没能生成出UML类图。下面是在Linux通过两个工具Graphviz+Doxygen生成类图的过程。安装软件:sudoaptinstallgraphvizdoxygen进入项目文件目录,首先生成配置文件:doxygen-gDoxygen.config然后编辑该配置文件,修改几个选项:EXTRACT_AL......
  • 迭代器模式
    迭代器提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。迭代器模式有两个角色,一个是迭代器,一个是聚合器,Java或则c#中的Collection,List,Set,Map就是聚合器。......
  • C++读取FY卫星遥感图像(HDF格式)
    转一下我自己的博客网上找了大概2周,艰难的实现了C++读取HDF图像,CSDN吃相真难看,好多文章都要会员。。。#include<cstdint>#include<hdf5.h>#include<iostream>#include<matplotlibcpp.h>#include<opencv2/opencv.hpp>#include<opencv2/core/core.hpp>#include<......
  • c++ 学习
     c++中常用的class:在C++中,有一些常用的标准库类和一些常见的自定义类,它们提供了各种功能,从容器和算法到文件处理和输入/输出。以下是一些在C++中常用的类:###标准库类:1.**std::string:**-用于处理字符串的类,提供了许多字符串操作的方法。2.**std::vector:**-动态......
  • c++11 乱模版
    std::is_same,std::enable_if,std::is_integraltemplate<typenameT>boolisZero(Tv){if(std::is_same<T,float>::value){return(fabs(v)<FLT_EPSILON);}elseif(std::is_same<T,double>::value){......
  • windows C++
    https://en.cppreference.com/w/cpp/string/basic_stringstd::basic_string C++ Stringslibrary std::basic_string Definedinheader <string>  template<   class CharT,   class Traits = std::char_traits<CharT>,   class......
  • C++ Qt开发:DateTime日期时间组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QDateTime日期与时间组件的常用方法及灵活运用。在Qt中,日期和时间的处理通常使用QDateTime类。......
  • windows c++ socket
    socket用winsocket时,send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,可以设置收发时限:intnNetTimeout=1000;//1秒//发送时限setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char*)&nNetTimeout,sizeof(int));//接收时限setsockopt(socket,SOL_SOCKET,......
  • C++基础 -7- 引用
    ———————引用———————引用就是数据本身不占用空间 ......