7.2. STL 容器速查

7.2.1. 序列容器

容器

特点

随机访问

插入/删除

vector

动态数组

O(1)

尾部 O(1),其他 O(n)

deque

双端队列

O(1)

头尾 O(1),其他 O(n)

list

双向链表

O(n)

任意位置 O(1)

forward_list

单向链表

O(n)

头部/迭代器后 O(1)

array

固定数组

O(1)

不支持

// vector
std::vector<int> v = {1, 2, 3};
v.push_back(4);
v.pop_back();
v.reserve(100);
v.resize(10);
v.shrink_to_fit();

// deque
std::deque<int> d = {1, 2, 3};
d.push_front(0);
d.push_back(4);

// list
std::list<int> l = {1, 2, 3};
l.push_front(0);
l.sort();
l.unique();
l.merge(other);

7.2.2. 关联容器

容器

底层结构

查找

插入

有序

set

红黑树

O(log n)

O(log n)

是

map

红黑树

O(log n)

O(log n)

是

multiset

红黑树

O(log n)

O(log n)

是

multimap

红黑树

O(log n)

O(log n)

是

unordered_set

哈希表

O(1) 平均

O(1) 平均

否

unordered_map

哈希表

O(1) 平均

O(1) 平均

否

// map
std::map<std::string, int> m;
m["key"] = 42;
m.insert({"key2", 100});
m.emplace("key3", 200);

if (auto it = m.find("key"); it != m.end()) {
    std::cout << it->second;
}

// C++17: insert_or_assign, try_emplace
m.insert_or_assign("key", 50);
m.try_emplace("key", 60);  // 只在不存在时插入

// unordered_map
std::unordered_map<std::string, int> um;
um.reserve(1000);  // 预分配桶

7.2.3. 容器适配器

// stack (LIFO)
std::stack<int> s;
s.push(1);
s.top();
s.pop();

// queue (FIFO)
std::queue<int> q;
q.push(1);
q.front();
q.back();
q.pop();

// priority_queue (最大堆)
std::priority_queue<int> pq;
pq.push(1);
pq.top();  // 最大元素
pq.pop();

// 最小堆
std::priority_queue<int, std::vector<int>, std::greater<int>> min_pq;

7.2.4. 常用算法

#include <algorithm>

std::vector<int> v = {3, 1, 4, 1, 5};

// 排序
std::sort(v.begin(), v.end());
std::sort(v.begin(), v.end(), std::greater<>{});  // 降序
std::stable_sort(v.begin(), v.end());

// 查找
auto it = std::find(v.begin(), v.end(), 4);
auto it = std::find_if(v.begin(), v.end(), [](int x) { return x > 3; });
bool found = std::binary_search(v.begin(), v.end(), 4);

// 变换
std::transform(v.begin(), v.end(), v.begin(), [](int x) { return x * 2; });

// 过滤
auto new_end = std::remove_if(v.begin(), v.end(), [](int x) { return x < 3; });
v.erase(new_end, v.end());

// 聚合
int sum = std::accumulate(v.begin(), v.end(), 0);
int product = std::accumulate(v.begin(), v.end(), 1, std::multiplies<>{});

// 其他
std::reverse(v.begin(), v.end());
std::shuffle(v.begin(), v.end(), std::random_device{});
auto [min, max] = std::minmax_element(v.begin(), v.end());

7.2.5. C++17/20 新算法

// C++17 并行算法
#include <execution>
std::sort(std::execution::par, v.begin(), v.end());

// C++20 Ranges
#include <ranges>
auto result = v 
    | std::views::filter([](int x) { return x > 0; })
    | std::views::transform([](int x) { return x * 2; })
    | std::views::take(5);

7.2.6. 字符串

std::string s = "hello";

// 操作
s += " world";
s.append("!");
s.insert(0, "Hi ");
s.erase(0, 3);
s.replace(0, 5, "Hello");

// 查找
size_t pos = s.find("world");
size_t pos = s.rfind("l");
size_t pos = s.find_first_of("aeiou");

// 子串
std::string sub = s.substr(0, 5);

// 转换
int n = std::stoi("42");
double d = std::stod("3.14");
std::string ns = std::to_string(42);

// string_view (C++17)
std::string_view sv = s;  // 无拷贝

7.2.7. 迭代器

// 迭代器类型
iterator                // 可修改
const_iterator          // 只读
reverse_iterator        // 反向
const_reverse_iterator  // 反向只读

// 迭代器函数
std::advance(it, n);    // 移动 n 步
std::next(it, n);       // 返回向前 n 步的迭代器
std::prev(it, n);       // 返回向后 n 步的迭代器
std::distance(first, last);  // 计算距离