STL容器删除元素的陷阱

今天看Scott Meyers大师的stl的用法,看到了我前段时间犯的一个错误,发现我写的代码和他提到错误代码几乎一模一样,有关stl容器删除元素的问题,错误的代码如下:
std::vector<struct> mFriendList;
...
std::vector<struct>::iterator iter = mFriendList.begin();
for ( ; iter != mFriendList.end(); ++iter)
{
    if (...)
        mFriendList.erase(iter);
}
记得当时Once给我说过这个问题,还给我改过代码,我当时不明白为什么,只知道程序执行的时候如果if为true那么程序就肯定会崩溃。
大师的说法是:当容易中的一个元素被删除时,指向该元素的所有迭代器都变得无效。上面的代码中,只要执行了erase(iter),那么iter就会变得无效,那么执行++iter就肯定会出错。

在网上看到有人总结如下两条:
1. 对于节点式容器(map, list, set)元素的删除,插入操作会导致指向该元素的迭代器失效,其他元素迭代器不受影响
2. 对于顺序式容器(vector,string,deque)元素的删除、插入操作会导致指向该元素以及后面的元素的迭代器失效

总结了一下,并回想Once当时给我改的代码,所以正确的写法应该是这样的:
1.对于节点式容器
std::list<struct> mList;
...
std::list<struct>::iterator iter = mList.begin();
for ( ; iter != mList.end(); )
{
    if (...)
    {
        //因为节点式只会导致当前节点迭代器失效,所以删除节点的同时对迭代器进行后移的操作,因为其他元素不会失效
        mList.erase(iter++);
    }
    else
    {
        ++iter;
    }
}

2.对于顺序式容器
std::vector<struct> mVector;
...
std::vector<struct>::iterator iter = mVector.begin();
for ( ; iter != mVector.end(); )
{
    if (...)
    {
        //这里就比较有说法了,因为顺序式容器会使本身和后面的元素迭代器都失效,所以不能简单的++操作
        //这里顺序式容器的erase()会返回紧随被删除元素的下一个元素的有效迭代器
        //而节点式容器的erase()的返回值是void,这点我感觉太神奇了,确实太神奇了!!!!
        iter = mVector.erase(iter);
    }
    else
    {
        ++iter;
    }
}

注意:容器看具体STL库的实现了,VS中两类容器的earse都返回下一个迭代器指针。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDBC1

1.jdbc的概述 是sun公司统一提供的一套接口规范,各个数据库生产商提供实现 注册驱动,获得连接,获得执行的SQL语句对象,释放资源 package com.learn.jdbc;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;import org.junit.Test;publ…

无符号哥伦布指数编码

在H264编解码中&#xff0c;哥伦布指数编码是经常用到的&#xff0c;下面是无符号哥伦布指数编码的C代码&#xff1a; static inline int bs_read_ue( bs_t *s ){ int i 0; while( bs_read1( s ) 0 && s->p < s->p_end && i < 32 ) { …

django后台多页面分页逻辑python代码

#!/usr/bin/env python # -*- coding:utf-8 -*- # Created by 秋叶夏风# 本模块的功能:<>def get_page_list(max_page,curr_page,leng):用于生成页数列表:param max_page:最大页数:param curr_page:当前页数:param leng:分页步长:return:list# max_page 20# curr_page …

python程序怎么保存到u盘_python实现usb自动拷贝程序的方法

python实现usb自动拷贝程序的方法 发布时间&#xff1a;2020-06-28 09:07:05 来源&#xff1a;亿速云 阅读&#xff1a;135 作者&#xff1a;清晨 这篇文章将为大家详细讲解有关python实现usb自动拷贝程序的方法&#xff0c;小编觉得挺实用的&#xff0c;因此分享给大家做个参考…

young people can also be a leader

2019独角兽企业重金招聘Python工程师标准>>> The leaders or directors of organizations are often older people. But some people say that young people can also be a leader. To what extent do you agree or disagree? In my view , young people can also …

BZOJ 2004 公交线路(状压DP+矩阵快速幂)

注意到每个路线相邻车站的距离不超过K&#xff0c;也就是说我们可以对连续K个车站的状态进行状压。 然后状压DP一下&#xff0c;用矩阵快速幂加速运算即可。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm>#define…

python爬取网易云歌单_详解python selenium 爬取网易云音乐歌单名

目标网站&#xff1a;首先获取第一页的数据&#xff0c;这里关键要切换到iframe里打印一下获取剩下的页数&#xff0c;这里在点击下一页之前需要设置一个延迟&#xff0c;不然会报错。结果&#xff1a;一共37页&#xff0c;爬取完毕后关闭浏览器 完整代码&#xff1a; url htt…

Idea的一些调试技巧及设置todo

程序员的工作内容&#xff0c;除了大部分时间写代码之外&#xff0c;因为有不少的时间是用在调试代码上。甚至说不是在调试代码&#xff0c;就是即将调试代码。 :) 今天我们来谈谈调试代码的一些技巧&#xff0c;在使用IDE提供的debugger时一些快速定位问题的方式。 看到这里的…

安装Node.js和npm

安装Node.js和npm 学习了&#xff1a;http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00143450141843488beddae2a1044cab5acb5125baf0882000 转载于:https://www.cnblogs.com/stono/p/6891242.html

c++ cstring 转换 char_cstring.h库常用函数

上周&#xff0c;老师讲了大整数的运算方法&#xff0c;我对大数的存储和运算还有些不理解&#xff0c;仔细思考了一下&#xff0c;其实还是训练孩子对机器存储数据的各种掌握和运用吧。不多想&#xff0c;先期孩子虽然一直学习&#xff0c;但是缺乏对知识的系统整理&#xff0…

Django后台管理之商品分类

商品分类 1.建表字段 1.pid&#xff1a;用来绑定父类的 2.path&#xff1a;用来拼接id&#xff0c;保证查询出的数据是按照层级关系展示的2.concat 把表中的两个字段拼接成一个新的字段&#xff0c;通过as重新命名3.查询语句 1.按照第二步拼接成新的字段的名字进行排序查询…

PMT_Stream数据结构

0123 012345670123456701234567012345671stream_type reserved_1elementary_PIDreserved_2ES_info_length 2ES_info_length …(描述信息)3…(描述信息)4crc32 1 节目号 stream_type 8指示了PID为elementary_PID的PES分组中原始流的类型&#xf…

Maven:基本使用

为什么80%的码农都做不了架构师&#xff1f;>>> 1.项目管理工具&#xff1a; Maven的repository&#xff0c;说白了就是dependency的仓库&#xff0c;它按照一定的规则将dependency存放起来&#xff0c;以作缓存&#xff0c;如果本机的 repository找不到某个depen…

UVA 11383 - Golden Tiger Claw(二分图完美匹配扩展)

UVA 11383 - Golden Tiger Claw 题目链接 题意&#xff1a;给定每列和每行的和&#xff0c;给定一个矩阵&#xff0c;要求每一个格子(x, y)的值小于row(i) col(j)&#xff0c;求一种方案&#xff0c;而且全部行列之和的和最小 思路&#xff1a;A二分图完美匹配的扩展&#xff…

浅谈web开发以及django的安装和入门

浅谈web开发 1.B/S和C/S结构 B/S:浏览器与服务器进行的交互模式&#xff08;不需要官方下载的&#xff0c;一夫多妻制&#xff09; C/S:客户机与服务器进项的交互模式&#xff08;必须官方下载的&#xff0c;一夫一妻制2.MVC和MVT MVC: M:模型层&#xff08;Model&#xff0…

大数据可视化html模板开源_大数据时代-可视化数据分析平台必不可少

公众号&#xff1a;不安分的猿人一、项目简介DataGear是一款数据管理与可视化分析平台&#xff0c;使用Java语言开发&#xff0c;采用浏览器/服务器架构&#xff0c;支持多种数据库&#xff0c; 主要功能包括数据管理、SQL工作台、数据导入/导出、数据集管理、图表管理、看板管…

java输出一些内容到日志文件

在eclipse中新建一个项目&#xff0c;在src下新建一个log4j.properties文件&#xff0c;文件内容为下&#xff1a;log4j.rootLogger debug,stdout,D,Elog4j.appender.E org.apache.log4j.DailyRollingFileAppenderlog4j.appender.E.File E://logs/error.log log4j.appender.E…

PMT_Header-节目映射表的数据结构2

1 标志位 table_id8固定为0x02 &#xff0c;标志是该表是PAT2段语法标志位section_syntax_indicator 1段语法标志位&#xff0c;固定为13 zero104保留字reserved_12保留字5有用的字节数section_length 12表示这个字节后面有用的字节数&#x…

Django中的Model模型

Model模型 模型是你的数据的唯一的、权威的信息源。它包含你所储存数据的必要字段和行为。 通常&#xff0c;每个模型对应数据库中唯一的一张表。 每个模型都是django.db.models.Model的一个Python 子类。模型的每个属性都表示为数据库中的一个字段。Django 提供一套自动生成的…

python有多少种模块_python如何查看有哪些模块

Question: 如何查看正则表达式模块re及其相关函数的意义 1、终端命令行下 python >> import sys >> sys.modules ################################### 一长串信息中字段modules对应的模块即为包含的模块。 ################################### >> import r…