引言
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。
一、C++ 容器的分类
C++ 容器按照用途大致分为三大类:
- 序列容器(Sequence Containers)
- 元素按顺序存储。
- 支持动态调整大小和顺序访问操作。
- 包括:
std::vector、std::array、std::deque、std::list。
- 关联容器(Associative Containers)
- 元素以键值对存储,通常用于高效查找。
- 数据存储有序,底层实现为平衡二叉树(如红黑树)。
- 包括:
std::set、std::map、std::multiset、std::multimap。
- 无序容器(Unordered Containers)
- 元素以哈希表存储,查找性能优于关联容器,但数据无序。
- 包括:
std::unordered_set、std::unordered_map。
二、序列容器解析
1. std::vector
简介
std::vector 是一个动态数组,支持自动扩展和随机访问,适用于需要频繁随机访问的场景。它是初学者最常使用的容器之一,因为它的使用方式和普通数组非常类似,但多了动态管理内存的功能。
特点
- 动态扩展:
std::vector的大小会根据需求动态调整,当元素数目超过当前容量时,它会自动分配更多的内存来容纳新元素。 - 连续存储:数据存储在连续的内存块中,因此访问性能高,遍历时效率优于链表等非连续存储容器。
- 插入和删除效率:
- 尾部操作高效:在尾部添加或删除元素的时间复杂度是 O(1),非常高效。
- 中间插入或删除效率低:由于
vector是连续存储,插入或删除中间元素时,需移动大量元素,因此效率为 O(n)。
常用操作
| 操作 | 方法 | 描述 |
|---|---|---|
| 添加元素 | push_back() | 在尾部插入元素 |
| 删除尾部元素 | pop_back() | 删除尾部元素 |
| 插入元素 | insert(iterator, value) | 在指定位置插入元素 |
| 删除指定元素 | erase(iterator) | 删除指定位置的元素 |
| 随机访问元素 | operator[] 或 at() |


