C++ Primer 学习笔记:顺序容器详解(基于Mooophy/Cpp-Primer项目)
【免费下载链接】Cpp-Primer C++ Primer 5 answers 项目地址: https://gitcode.com/gh_mirrors/cp/Cpp-Primer
前言
顺序容器是C++标准库中非常重要的一部分,它提供了管理元素集合的能力。本文将深入探讨C++ Primer第9章关于顺序容器的核心概念,帮助读者理解不同容器的特性、适用场景以及常见操作。
顺序容器类型选择指南
在实际编程中,我们需要根据具体需求选择合适的顺序容器:
-
std::list(双向链表)
- 适合频繁在任意位置插入/删除元素
- 示例:需要保持元素按字母顺序排列的单词列表
- 时间复杂度:插入/删除操作O(1)
-
std::deque(双端队列)
- 适合需要在头部和尾部进行插入/删除操作
- 示例:实现队列数据结构(先进先出)
- 时间复杂度:头尾插入/删除O(1)
-
std::vector(动态数组)
- 适合随机访问和尾部操作
- 示例:需要排序的大量整数
- 时间复杂度:随机访问O(1),尾部插入/删除O(1)
迭代器深入理解
迭代器是访问容器元素的通用方式,需要注意以下几点:
-
迭代器范围:由一对迭代器begin和end表示,必须满足:
- 指向同一容器
- 可以通过递增begin到达end
-
const_iterator与iterator的区别:
- cbegin()返回const_iterator(只读)
- begin()返回iterator(可读写)
-
容器特定限制:
- list不支持随机访问,因此不能使用<运算符比较迭代器
- 正确做法是使用!=运算符
容器初始化方式大全
vector提供了多种初始化方式:
vector<int> vec; // 空vector
vector<int> vec(10); // 10个0
vector<int> vec(10, 1); // 10个1
vector<int> vec{1,2,3}; // 初始化列表
vector<int> vec(other); // 拷贝构造
vector<int> vec(beg,end); // 范围构造
容器操作注意事项
-
resize()与reserve()区别:
- resize()改变容器大小,可能添加或删除元素
- reserve()仅预分配内存,不改变元素数量
-
插入操作对迭代器的影响:
- 向vector插入元素会使所有迭代器失效
- 解决方案:预先调用reserve()或重新获取迭代器
-
删除操作边界情况:
- 删除范围[elem1,elem1):无操作
- 删除范围[elem1,end()):删除elem1到末尾
- 删除范围[end(),end()):无操作
字符串特殊操作
string作为特殊顺序容器,提供了丰富的字符串操作:
-
查找操作:
- find():查找子串
- find_first_of():查找任意匹配字符
- find_first_not_of():查找第一个不匹配字符
-
性能优化:
- 预先知道最小大小时使用reserve()
- 大量拼接操作时使用+=或append()
实际编程技巧
-
forward_list特殊处理:
- 单向链表需要维护前驱迭代器
- 插入操作使用insert_after()
-
容器适配:
- 不同类型容器间可以通过迭代器范围构造
- 元素类型可以不同,只要可转换
-
容量管理:
- vector增长策略通常是加倍当前容量
- size() ≤ capacity()总是成立
总结
顺序容器是C++编程中的基础工具,理解它们的特性和适用场景对于编写高效代码至关重要。通过本文的讲解,读者应该能够:
- 根据需求选择合适的容器类型
- 正确使用迭代器访问容器元素
- 理解容器操作对性能的影响
- 掌握字符串处理的特殊方法
在实际开发中,建议多思考不同容器的时间/空间复杂度,选择最适合当前场景的实现方式。
【免费下载链接】Cpp-Primer C++ Primer 5 answers 项目地址: https://gitcode.com/gh_mirrors/cp/Cpp-Primer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



