0

0

C++STL容器erase和clear操作注意事项

P粉602998670

P粉602998670

发布时间:2025-09-20 09:34:01

|

316人浏览过

|

来源于php中文网

原创

正确使用erase和clear需注意迭代器失效与内存管理:erase删除元素后迭代器失效,应使用返回值更新迭代器或采用erase-remove惯用法;不同容器erase性能不同,vector中间删除慢,list较快;clear清空元素但不释放内存,可用swap或shrink_to_fit释放;指针容器需手动释放资源,推荐使用智能指针。

c++stl容器erase和clear操作注意事项

在使用C++ STL容器时,eraseclear 是两个常用的操作,用于删除容器中的元素。虽然它们功能明确,但在实际使用中如果不注意细节,容易引发未定义行为或性能问题。

erase操作的迭代器失效问题

调用容器的 erase 方法会删除指定位置或范围的元素,并释放对应内存。关键问题是:被删除元素的迭代器会失效

常见错误写法:

for (auto it = vec.begin(); it != vec.end(); ++it) {
    if (condition(*it))
        vec.erase(it); // 错误:erase后it失效,++it未定义
}

正确做法是使用 erase 返回的下一个有效迭代器:

立即学习C++免费学习笔记(深入)”;

  • 对于支持的容器(如 vector、list),erase 返回删除元素之后的迭代器
  • 循环中应使用返回值更新迭代器

正确示例:

for (auto it = vec.begin(); it != vec.end(); ) {
    if (condition(*it))
        it = vec.erase(it); // it被更新为下一个有效位置
    else
        ++it;
}

更推荐使用 erase-remove 惯用法,避免手动迭代:

vec.erase(std::remove_if(vec.begin(), vec.end(), condition), vec.end());

不同容器的erase性能差异

不同容器的 erase 性能表现不同,使用时需注意:

ChatX翻译
ChatX翻译

最实用、可靠的社交类实时翻译工具。 支持全球主流的20+款社交软件的聊天应用,全球200+语言随意切换。 让您彻底告别复制粘贴的翻译模式,与世界各地高效连接!

下载
  • vector:删除中间元素需移动后续元素,时间复杂度为 O(n)
  • deque:两端删除快,中间删除慢
  • list/set/map:基于节点的容器,删除任意元素为 O(1) 或 O(log n),不会影响其他元素的迭代器(除被删元素外)

频繁删除操作建议使用 list 或使用 vector 配合 erase-remove 模式。

clear操作的注意事项

clear 会删除容器中所有元素,使 size 变为 0,但 不一定释放底层内存

  • vector 调用 clear 后,capacity 通常保持不变
  • 若需真正释放内存,可使用 swap 技巧:
std::vector().swap(vec); // 清空并释放内存

或 C++11 起可调用 shrink_to_fit()(但不保证一定释放):

vec.clear();
vec.shrink_to_fit();

指针容器的资源管理

若容器存储的是指针(如 std::vector),调用 eraseclear 不会自动释放指针指向的内存。

  • 需手动先 delete 指针
  • 建议使用智能指针(如 shared_ptr)代替裸指针

示例:

std::vector<:shared_ptr>> ptrVec;
ptrVec.clear(); // 自动释放资源

基本上就这些。掌握 erase 和 clear 的行为特点,避免迭代器失效和内存泄漏,能写出更安全高效的代码。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

713

2023.08.22

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

73

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

25

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

36

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

31

2025.11.27

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

266

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.12.29

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

3

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

1

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.7万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号