
关于erase的一个奇bai怪chi问题
发布日期:2021-05-07 22:06:53
浏览次数:18
分类:精选文章
本文共 636 字,大约阅读时间需要 2 分钟。
遇到C++中的迭代器使用问题时,理解容器的行为至关重要。以下是针对使用std::map
和迭代器进行擦除操作的正确方法:
问题背景:我在编写代码时遇到了迭代器擦除的问题,不同的写法导致了不同的结果。通过查阅和实践,我逐渐理解了迭代器在容器修改操作中的行为。
初步尝试:
错误写法1:
mp.erase(it++);
- 这种写法会先复制迭代器
it
,然后将其后移,并尝试擦除原来的it
所指的元素。由于it
已经被后移,擦除操作可能擦除错误的或已经不存在的元素,导致指针失效。
- 这种写法会先复制迭代器
错误写法2:
mp.erase(it); it++;
- 在擦除后使用
it++
会导致it
指向下一个元素,但这样可能会跳过正确的下一个元素,或者指向一个已经被擦除的位置,导致未初始化访问。
- 在擦除后使用
正确方法:it = mp.erase(it);
erase
方法返回擦除操作后元素的下一个迭代器。将返回值赋给it
,这样it
会指向正确的下一个位置,避免了手动操作可能导致的错误。
迭代器行为理解:
- 容器的大小在擦除操作后减少,原有的迭代器可能指向已经删除的位置。
erase
返回的新迭代器指向被擦除元素后的下一个位置,确保后续操作正确无误。
附加知识:while(i++)
的工作原理
i++
先递增然后返回原值,而++i
先递增再返回新值。- 在性能敏感的代码中,
++i
更高效,因为它避免了多次访问内存。
通过上述分析,我确保了在使用迭代器进行容器修改时的正确写法,避免了潜在的错误。这种理解有助于在日后编写更高效且可靠的C++代码。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月06日 02时16分49秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
entity framework core在独立类库下执行迁移操作
2019-03-06
Asp.Net Core 2.1+的视图缓存(响应缓存)
2019-03-06
服务器开发- Asp.Net Core中的websocket,并封装一个简单的中间件
2019-03-06
没花一分钱的我竟然收到的JetBrains IDEA官方免费赠送一年的Licence
2019-03-06
Redis 集合统计(HyperLogLog)
2019-03-06
RE套路 - 关于pyinstaller打包文件的复原
2019-03-06
【wp】HWS计划2021硬件安全冬令营线上选拔赛
2019-03-06
Ef+T4模板实现代码快速生成器
2019-03-06
dll详解
2019-03-06
c++ static笔记
2019-03-06
C++中头文件相互包含与前置声明
2019-03-06
JQuery选择器
2019-03-06
MVC中在一个视图中,怎么加载另外一个视图?
2019-03-06
SQL--存储过程
2019-03-06
MVC学习系列5--Layout布局页和RenderSection的使用
2019-03-06
MVC学习系列13--验证系列之Remote Validation
2019-03-06
多线程之volatile关键字
2019-03-06
2.1.4奇偶校验码
2019-03-06
2.2.2原码补码移码的作用
2019-03-06