常用容器核心方法速查
std::vector / std::string
动态连续数组与字符串类型,支持高效尾部操作与快速随机访问。
| 方法名(参数) | 作用说明 |
|---|---|
push_back(val) |
在末尾插入元素 |
pop_back() |
删除末尾元素 |
insert(pos, val) |
在迭代器 pos 前插入 val |
erase(pos) / erase(first, last) |
删除指定位置或区间的元素 |
assign(n, val) |
用 n 个 val 替换容器现有内容 |
reserve(n) |
预分配内存容量,避免反复扩容导致的内存搬移 |
resize(n) |
改变容器内元素实际数量(多退少补) |
at(index) |
带越界检查的索引访问(越界抛出异常) |
front() / back() |
获取首/尾元素的引用 |
data() |
返回指向底层连续内存的指针(兼容 C 风格接口) |
c_str() / substr(pos, len) |
(仅 string) 转换为以 \0 结尾的 C 字符串 / 截取子串 |
std::deque
双端队列,采用分段连续内存结构,支持两端高效增删。
| 方法名(参数) | 作用说明 |
|---|---|
push_front(val) / pop_front() |
(特有) 在头部插入或删除元素 |
push_back(val) / pop_back() |
在末尾插入或删除元素 |
operator[] / at(index) |
支持常数级随机访问下标 |
shrink_to_fit() |
释放未使用的多余内存分片 |
std::list & std::forward_list
双向链表与单向链表,任意位置增删复杂度为 $O(1)$,不支持随机访问。
| 方法名(参数) | 作用说明 |
|---|---|
push_front(val) / pop_front() |
头部插入与删除 |
remove(val) |
删除所有值等于 val 的节点 |
remove_if(predicate) |
删除所有满足特定谓词条件的节点 |
unique() |
移除相邻的重复元素(通常需先排序) |
reverse() |
反转链表元素顺序 |
sort() |
链表专用内建排序(链表不支持随机访问迭代器,不可使用 std::sort) |
splice(pos, list2) |
将另一个链表剪切拼接到当前链表的指定位置 |
merge(list2) |
合并两个已排序的链表 |
std::set / std::multiset
基于红黑树实现的有序集合,元素自动按键值升序排列。
| 方法名(参数) | 作用说明 |
|---|---|
insert(val) |
插入元素(set 遇到重复项则失败;multiset 允许重复) |
erase(val) |
删除所有值等于 val 的节点 |
find(val) |
查找元素并返回迭代器;若未找到则返回 end() |
count(val) |
统计 val 出现的次数 |
lower_bound(val) |
返回首个大于等于 val 的位置迭代器 |
upper_bound(val) |
返回首个严格大于 val 的位置迭代器 |
std::map / std::multimap
基于红黑树实现的有序键值对映射。
| 方法名(参数) | 作用说明 |
|---|---|
operator[key] |
(仅 map) 访问或插入;若 key 不存在则就地默认构造新条目 |
at(key) |
访问指定键对应的值;若键不存在则抛出 std::out_of_range 异常 |
insert({k, v}) |
插入键值对 |
find(key) |
根据键查找条目迭代器 |
erase(key) |
根据键删除对应条目 |
重点容器详解与示例
1. std::vector
- 依赖头文件:
#include <vector> - 底层特性:堆上连续内存空间,容量不足时通常以 1.5 倍或 2 倍动态扩容并搬移元素。支持随机访问,尾部插入均摊复杂度为 $O(1)$。
常用初始化构造
#include <vector>
std::vector<int> v1; // 空容器
std::vector<int> v2(10); // 10 个元素,默认初始化为 0
std::vector<int> v3(10, 5); // 10 个元素,初值均为 5
std::vector<int> v4 = {1, 2, 3}; // 初始化列表 (C++11)
std::vector<int> v5(v4); // 拷贝构造
std::vector<int> v6(v4.begin(), v4.end()); // 迭代器区间构造
结合 <algorithm> 遍历示例
#include <iostream>
#include <vector>
#include <algorithm>
void printElement(int num) {
std::cout << num << " ";
}
int main() {
std::vector<int> vec = {1, 2, 3};
// 方式 1:函数指针 / 自由函数遍历
std::for_each(vec.begin(), vec.end(), printElement);
std::cout << "\n";
// 方式 2:Lambda 表达式遍历
std::for_each(vec.begin(), vec.end(), [](int num) {
std::cout << num << " ";
});
std::cout << "\n";
// 方式 3:基于范围的 for 循环 (现代 C++ 推荐)
for (const auto& item : vec) {
std::cout << item << " ";
}
std::cout << "\n";
return 0;
}
2. std::array
- 依赖头文件:
#include <array> - 底层特性:栈上分配的固定尺寸连续内存数组,是对原生 C 数组的高级封装。不具备动态扩容开销,编译期必须确定长度。
常用初始化与特点
#include <array>
// 必须显式声明类型与固定长度
std::array<int, 3> a1 = {1, 2, 3};
// 栈上未初始化数组,内部数值随机未定义
std::array<int, 3> a2;
// 访问接口与 vector 保持一致
int first = a1.front();
int val = a1.at(1);