c++中删除迭代器指向的元素后,迭代器指向的被删除元素后面的元素

C++ STL容器元素正确删除 参考文献: 【1】迭代器失效问题:https://www.cnblogs.com/willowcc1803/p/10194757.html 阅读详情

1.  C++向容器中插入和删除元素的时候,迭代器会失效,下面是正确删除容器元素的做法

void StatsServer::removeExpiredWorkers() {
  size_t expiredWorkerCount = 0;
  size_t expiredUserCount = 0;

  pthread_rwlock_wrlock(&rwlock_);  // write lock

  // delete all expired workers
  for (auto itr = workerSet_.begin(); itr != workerSet_.end(); ) {
    const int32_t userId   = itr->first.userId_;
    shared_ptr<WorkerShares> workerShare = itr->second;

    if (workerShare->isExpired()) {
      itr = workerSet_.erase(itr);

      expiredWorkerCount++;
      totalWorkerCount_--;
      userWorkerCount_[userId]--;
      
      if (userWorkerCount_[userId] <= 0) {
        userWorkerCount_.erase(userId);
      }
    } else {
      itr++;
    }
  }

  // delete all expired users
  for (auto itr = userSet_.begin(); itr != userSet_.end(); ) {
    shared_ptr<WorkerShares> workerShare = itr->second;

    if (workerShare->isExpired()) {
      itr = userSet_.erase(itr);

      expiredUserCount++;
      totalUserCount_--;
    } else {
      itr++;
    }
  }

  pthread_rwlock_unlock(&rwlock_);

  LOG(INFO) << "removed expired workers: " << expiredWorkerCount << ", users: " << expiredUserCount;
}

2. 遍历读取容器的元素的写法如下

for(auto itr = vec.begin(); itr != vec.end(); ++itr)
{
    read(*itr);
}

 

C++迭代器失效 迭代器失效就是迭代器底层对应指针所指向的空间倍销毁了,导致使用了一块已经被释放了的空间。 容器操作可能使迭代器失效,一个失效的迭代器将不再表示任何元素。使用失效的迭代器是一个严重的程序设计错误,很可能产生与使用未初始化化指针一样的问题。......... 阅读详情

相关推荐

XTDrone平台FAST-LIO2与ego-planner结合路径规划部署

之前做了XTDrone平台FAST-LIO2的部署现在将其结合ego-planner进行导航规划,之前查看教程是使用视觉进行定位导航的,现在重新学习。修改advanced_param_xtdrone.xml,这里有视觉信息,不修改会报错显示为输入视觉话题信息。怎么描述 ,感觉当时觉得很难的问题突然就给解决了,一顿复杂,最近勤更新吧,继续开始学习。还有一个想法就是两个rviz结合在一起启动,写了一个demo,融合的不太好感觉额。改为只使用雷达点云,这里仿真的话题是/scan。

m0_56093217的博客 1083

C++中利用迭代器删除元素会发生什么?

利用迭代器删除元素会发生什么? (1)对于关联容器(如map,set,multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前的iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入,删除一个结点不会对其他结点造成影响。使用方式如下例子:set valset = { 1,2,3,4,5,6 };

YF_Li123的博客 9308

STM32实战:如何快速移植野火PID调试助手协议到你的电机控制项目

本文详细解析了如何将野火PID调试助手协议快速移植到STM32电机控制项目中。通过深度剖析协议帧格式、数据解析逻辑及环形缓冲区应用,提供了从工程结构规划、核心函数适配到串口中断集成的完整移植步骤。文章还分享了协议健壮性增强、数据上报频率优化等高级调试技巧,帮助开发者构建稳定可靠的上位机调试通道,大幅提升PID参数整定效率。

weixin_29171129的博客 468

C++容器迭代删除元素的正确方法

原理是:在擦除之前,先将迭代器往后移动。

canlynetsky的博客 1625

nrf52840的uart0与uart1双串口使用

nrf52840的uart0与uart1双串口使用 项目原使用nrf52832,后面由于项目需要用到双串口,改用nrf52840,官方的例程没看到使用uart1的,找遍全网都没找到uart1的使用资料,有些不负责任的网文居然说40也只有一个uart,吓得俺赶紧又查看了一次datesheet,O得K、木鸭梨 SDK代码uart驱动中,搜索到uart1的驱动部分,说明官方驱动有uart1支持的 自己动手,丰衣足食吧,下面以nRF5_SDK_17.0.0_9d13099版本,在examples\ble_per

chhen168的博客 5625

MBIST --- PATR2.Memorybist 测试流程

mem bist作为现在design设计中不可或缺的DFT设计内容,越发重要。本章节主要介绍mem bist的flow,如何在tessent中实现mbist以及tessent中的一些命令和mode。

sinat_27691203的博客 6006

C++中vector迭代器失效问题以及删除所有带有某值的元素

C++中vector迭代器失效问题以及删除特定元素的问题 1.迭代器的失效 C++标准库(第2版)中提到: 如果删除某个元素,所有容器(除了vector和deque)保证迭代器以及用以指向其他元素的引用继续保持有效。 对于vector而言,只有被删除元素之前的迭代器、指针和引用有效,被删除元素以及被删除元素之后的迭代器、指针和引用均会失效。 如果插入某个元素,只有list、forward_list和关联式容器(map/multimap、set/multiset)可以保证原本的迭代器和指向元素的引用继

mingwu96的博客 4860

在CoppeliaSim里实现一个最简单的强化学习

前言 上一篇文章中介绍了CoppeliaSim的一些基本知识和一个简单的用python去控制CoppeliaSim里面四旋翼无人机运动的一个例子。文章链接 :https://blog.youkuaiyun.com/qq_37051669/article/details/115324851 本文将继续介绍如何利用CoppeliaSim的物理环境去实现一个最简单的强化学习。 如何实现强化学习 强化学习(Reinforcementlearning)是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利.

qq_37051669的博客 3765

【C++】vector迭代器iterator及删除元素

vector迭代器iterator及删除元素。vector::iterator是访问元素地址的迭代器,使用其可以循环访问元素,使用*可以获取访问元素的值。当然也可以用下标访问。循环vector,根据条件删除元素,注意vector为空的时候需要break跳出循环。循环时如果删除了元素,则自动指向下一个元素,否则需要手动指向下一个元素。...

豆芽菜 4613

【麒麟桌面系统】企业微信提示当前副设备的企业微信版本较低

银河麒麟系统中登录企业微信时出现"副设备版本较低"的报错,可通过两种方案解决:1)更新最新版企业微信,需替换软件源并刷新软件商店安装8.0-50-4.1.26.6019kylin5版本;2)安装内测5.0版本企业微信,需下载deb包后使用sudo dpkg命令安装。文章还提供了常见问题解决表和长期维护建议,包括系统更新检查、软件源验证等维护项目及具体操作指南。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 2274

Android 9.0 SystemUI禁用长按recent键的分屏功能

​ 在9.0的系统产品开发中,系统对于多窗口模式默认会有分屏功能的,但是在某些产品中,需要禁用分屏模式,所以需要在导航栏中 禁用长按recent的分屏模式功能,接下来分析下相关分屏模式的实现 ​

安卓兼职framework和app工程师的博客 449

C++删除迭代器两种方法对比(list.erase(it++)和it=list.erase(it))

C++ STL容器初学使用时,遍历删除某值元素一定要注意以下几点: 错误示范: 修改方法一: 修改方法二: 两种正确编码对其它STL容器一样有效,区别在于: 第一种修改是 it 先++,指向下一个迭代器,再释放之前的迭代器,类似于: 因为是值传递,在节点被析构之前,it已经安全地跳转到下一个节点,这里强调一下,值传递原因,erase函数调用和it++是同时的,可能和编译器有关,代码理论上是先调用完函数再做++操作,可能代码在将it值赋值到传参时就回头做++了,之后再执行erase里

Heworld的博客 5476

Python爬虫:抓取外卖平台餐厅菜单、价格与评价数据

美团外卖:国内领先的外卖平台之一,提供餐饮外卖、超市配送等服务。饿了么:另一大主流外卖平台,覆盖广泛的餐饮品类。等:国际性的外卖平台。在本文中,我们将以美团外卖为例,展示如何抓取餐厅的菜单、价格和评价等数据。我们会使用Python的爬虫库,如Scrapy和Selenium,来解决抓取任务。本文详细介绍了如何使用Python爬虫抓取外卖平台上的餐厅菜单、价格、评价等信息。我们展示了如何使用Scrapy和Selenium抓取静态与动态网页数据,如何清洗和存储数据,并讨论了如何应对外卖平台的反爬虫机制。

2201_76125261的博客 1499

vector::erase方法,返回值是更新后的容器的被删除元素的后一个元素的迭代器,如果需要指向删除元素的前面一个元素的迭代器就要-1

vector::erase方法,返回值是更新后的容器的被删除元素的后一个元素的迭代器,如果需要指向删除元素的前面一个元素的迭代器就要-1

qq_34581491的博客 8608

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++编程笔记——从map时中删除元素

#include #include using namespace std; int main() { map map1; map::iterator mapit; map::iterator saveit; map1[1] = 1; map1[2] = 2; map1[3] = 3; map1[4] = 4; mapit

积沙成塔 4745

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++---迭代器删除元素避免索引混乱

在C++中,使用索引直接删除容器元素可能导致"索引混乱",因为删除操作会改变后续元素的位置。相比之下,迭代器提供了更安全的删除方式:迭代器是容器元素的"智能指针",能动态感知容器变化,而erase()方法会返回新的有效迭代器。不同容器的迭代器失效规则不同,vector删除后所有后续迭代器失效,而链表容器仅失效被删除元素的迭代器。正确做法是:用erase()返回值更新迭代器,循环中避免盲目递增;优先使用remove_if等标准算法;注意不同容器的特性差异。

MzKyle的博客 2277

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【c++】vector中删除元素

1.删除指定范围的元素 vector删除元素之pop_back(),erase(),remove() 向量容器vector的成员函数op_back()可以删除最后一个元素. 而函数erase()可以删除由一个iterator指出的元素,也可以删除一个指定范围的元素。 还可以采用通用算法remove()来删除vector容器中的元素. 不同的是:采用remove一般情况下不会改变容器的大小,而pop_back()与erase()等成员函数会改变容器的大小。 C++ STL vecto

ystraw - Come on!!! 3万+

C++容器类插入和删除时迭代器的失效情况总结

容器底层数据结构类型 包含的具体容器 内存分配特点 insert操作后迭代器失效情况 erase操作后迭代器失效情况 数组型数据结构 vector, string, deque, array 元素分配在连续的内存中 会使得插入点之后的元素向后移动,故插入点之后的迭代器全部失效 会使得删除点之后的元素向前移动,故删除点及其之后的迭代器全部失效 链表型数据结构 list, forw...

日沉云起的博客 3504

如何正确删除vector中的元素

今天来探讨C++中的一个基础问题。如何正确地删除`vector`中符合条件的某元素。比如,有一个`vector<int> nums = {1, 2, 2, 2, 2, 3, 5}`,要求删除`nums`中所有值为2的元素。C++初学者可能很快就写出代码:

Vincent的专栏 3万+

C++迭代器

什么是迭代器: C++中,迭代器就是一个类似于指针的对象,它能够用来遍历C++标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。以下面的string为例子介绍说明。 对string 对象s1正向遍历输出,代码如下所示: string::iterator it = s.begin(); //此处的begin()函数有两个重载函数,分别是 //iterator begin(); //const_iterator begin() const; //调用他们的对象,分别是可以

weixin_41368411的博客 2万+

C++用迭代器正确删除map元素

吃了这玩意的大亏,特此记录! 文章目录在C++98前,erase操作在C++11后,的erase操作用迭代器删除map中某一元素的正确用法 C++中删除map里的元素需要调用erase操作,但是错误的调用,会导致很多不可预支的问题,甚至于程序运行崩溃,不幸的是,楼主就遇到此情况,两天的Debug,结果发现仅是map删除元素时操作不当的问题! 在C++98前,erase操作 删除元素的操作是这样的 void erase (iterator position); size_type erase (const k

hjxu2016的博客 1万+

【C++】迭代器、反向迭代器详解

http://c.biancheng.net/view/338.html https://blog.youkuaiyun.com/kjing/article/details/6936325 https://blog.youkuaiyun.com/qq_22194315/article/details/57144854 一、迭代器 1. 概述 要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读..

lemonxiaoxiao的博客 6037

C++中利用迭代器删除元素

转自:https://blog.youkuaiyun.com/yf_li123/article/details/75003425#comments (1)对于关联容器(如map,set,multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前的iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入,删除一个结点不会对其...

青山绿水 4994

C++迭代器删除、插入元素

迭代器是容器五大组件中十分重要的一种,为我们提供了一种与容器种类、元素类型无关的访问容器的方法。 按照是否提供修改容器元素内容、遍历方法等、迭代器可分为五大类,如下图所示: 有关五种迭代器的具体使用,可参考CPPreference等权威资料。 首先贴一篇博客:http://m.blog.youkuaiyun.com/zhongjiekangping/article/details/5624922  ...

zxh2075的专栏 1599

erase返回值指向删除元素的下一个元素

erase的返回值是一个迭代器,指向删除元素下一个元素。 在使用vector的内置的erase的删除时出现错误。 先给大家看一段简单的代码 #include<iostream> #include<vector> using namespace std; int main(){ vector<int> vec_in; vector<int>...

weixin_42917994的博客 1907

【C++】STL 容器 - set 集合容器 ③ ( set 集合容器常用 api 简介 | 删除元素 | 删除指定值的元素 | 删除指定迭代器位置元素 | 删除指定迭代器范围元素 )

一、删除元素 1、删除指定值的元素 - erase 函数 2、删除指定迭代器位置的元素 - erase 函数 3、删除指定迭代器范围的元素 - erase 函数 4、删除集合中的所有元素 - clear 函数

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 3537
上一篇: bitcoind环境搭建
下一篇: EOS白皮书中文版
我能想到的
博客等级 码龄12年 44粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值