常用容器核心方法速查

std::vector / std::string

动态连续数组与字符串类型,支持高效尾部操作与快速随机访问。

方法名(参数) 作用说明
push_back(val) 在末尾插入元素
pop_back() 删除末尾元素
insert(pos, val) 在迭代器 pos 前插入 val
erase(pos) / erase(first, last) 删除指定位置或区间的元素
assign(n, val) nval 替换容器现有内容
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);