C++ 标准模板库(Standard Template Library,STL)基础详解--stl学习查询收藏这一篇就够了

程序员成长:技术、职场与思维模式实战指南 10w+人浏览 1.4k人参与

1. STL概念

  1. STL(Standard Template Library,标准模板库)是 C++ 标准库中那套“容器 + 算法 + 迭代器”的泛称,用模板实现泛型编程。最早由 HP 的 STL 演化而来,在 C++98 被标准化。今天大家口头上常说的 STL,通常指这几块核心组件:
    • 容器(Containers):存放数据的结构
    • 算法(Algorithms):如 sort, find, accumulate, transform, lower_bound 等(头文件 , )
    • 迭代器(Iterators):把算法与容器解耦的“指针风格”对象(输入/输出/前向/双向/随机访问 等类别)
    • 函数对象/谓词(Function Objects/Predicates):比较器、定制规则(今天常用 lambda直接定制规则)
    • 适配器(Adapters):容器/迭代器/函数的包装器(如 back_inserter, std::not_fn)
    • 分配器(Allocator):内存分配策略(大多时候用默认的即可)

2. STL常用容器分类:

1. 顺序/序列类(Sequence)

容器底层数据结构(实现习惯)主要特性/复杂度要点
std::array<T, N>固定长度连续内存编译期定长;随机访问 O(1);几乎不失效(对象析构除外)。
std::vector<T>动态数组(连续内存),几何倍数扩容push_back 均摊 O(1);中间插/删 O(n);扩容会使所有迭代器/引用失效
std::deque<T>分段数组(块列表 + 中央索引)头/尾插删 O(1);随机访问 O(1);整体不连续;在首尾操作常使迭代器失效。
std::list<T>双向链表(节点存储)已知位置插删/拼接 splice O(1);无随机访问;迭代器/引用稳定(删掉的那个失效)。
std::forward_list<T>单向链表更轻量;只提供前向迭代;头部/已知前驱处插删 O(1);无 size()
std::basic_string<charT>std::string动态数组(连续内存);多数实现有 SSO(小字符串优化)语义与 vector 类似(按字符);扩容规则近似;是否 SSO 非强制、但常见。

2. 有序关联(Ordered Associative)

容器底层数据结构主要特性/复杂度要点
std::set / std::multiset平衡二叉搜索树(通常红黑树)有序、去重/可重复;查找/插入/删除 O(log n);迭代器稳定(被删元素除外)。
std::map / std::multimap平衡 BST(通常红黑树)有序键值对;操作 O(log n);支持自定义比较器。

3. 无序关联(Unordered / Hash)

容器底层数据结构主要特性/复杂度要点
std::unordered_set / std::unordered_multiset哈希表:桶数组 + 链地址法(节点链表)平均查找/插入/删除 O(1)、最坏 O(n);rehash使迭代器失效(引用通常仍有效)。
std::unordered_map / std::unordered_multimap同上同上;可调装载因子 max_load_factor,必要时 rehash/ reserve

4. 适配器(基于其他容器的包装的容器)

容器适配器典型底层主要特性/复杂度要点
std::stack默认 deque(也可用 vector/listLIFO;push/pop/top O(1)(取决于底层)。
std::queue默认 dequeFIFO;push 尾/pop 头 O(1)。
std::priority_queuevector 上的二叉堆(最大堆)top O(1);push/pop O(log n);不稳定排序。

5. C++23 扩展

容器底层数据结构要点
std::flat_set / std::flat_map(以及 multi 版本)排序的连续存储(常见为 vector + 二分查找)查找 O(log n),插删 O(n);缓存友好,小/中规模数据很香。实现支持度视编译器而定。

3. 容器的操作

1. 通用(几乎所有容器都有)

  • begin()/end()/cbegin()/cend():迭代起止(遍历)

  • rbegin()/rend():反向迭代

  • size():元素个数

  • empty():是否为空

  • clear():清空(迭代器多失效)

  • swap(other) / std::swap(a,b):常数时间交换

  • 赋值/构造:拷贝/移动构造、operator=

2. 顺序容器共通(vector/deque/list/forward_list/array/string)

元素访问

  • front() / back():首/尾元素

  • operator:随机访问(无边界检查)

  • at(i):带边界检查

  • data():底层指针(连续存储类)

插入/构造

  • insert(pos, x) / emplace(pos, args…):在任意位置插入

  • push_back(x) / emplace_back(…):尾部插入

  • push_front(x) / emplace_front(…):头部插入(deque/list/forward_list)

  • assign(n, x) / assign(first,last):重置内容

删除/调整

  • erase(pos) / erase(first,last):删除区间

  • pop_back() / pop_front():弹出尾/头

  • resize(n):改变大小(不足补、超出截)

vector(动态数组)专属

  • capacity():容量

  • reserve(n):预留容量(减少扩容)

  • shrink_to_fit():回收冗余容量

  • 注意:vector在大小达到capacity时会扩容,扩容会使迭代器/引用全部失效;随机访问 O(1)。

deque(分段数组)

  • 注意:无 capacity/reserve;首尾插删 O(1),随机访问 O(1)。

list(双向链表)

  • splice(pos, other[, it|first,last]):常数时间拼接

  • remove(val) / remove_if(pred):删除匹配

  • unique():相邻去重

  • merge(other[, comp]):合并有序链表

  • sort([comp]) / reverse():链表内排序/反转

  • 注意:迭代器稳定(被删元素除外),无随机访问。

forward_list(单链表)

  • before_begin():头前迭代器

  • insert_after(pos, x) / emplace_after(…)

  • erase_after(pos) / erase_after(first,last)

  • 注意:仅前向迭代;无 size()。

array

  • fill(x):填充

  • 其他如 size()/data()/front()/back() 同上

  • 注意:定长,不能插删元素。

3. 有序关联容器(set/multiset/map/multimap,红黑树等)

查找/区间:

  • find(key):定位迭代器(O(log n))

  • count(key):计数(set/map 为 0/1;multi* 可>1)

  • lower_bound(key) / upper_bound(key) / equal_range(key):范围查询

  • contains(key)(C++20):是否存在

插入/删除:

  • insert(x) / emplace(args…) / erase(key|it|first,last)

仅 map/multimap:

  • operator:若无则插入默认值并返回引用

  • at(key):带检查访问

  • insert_or_assign(k,v) / try_emplace(k, args…)(C++17)

节点操作(C++17):

extract(k|it) → insert(node) / merge(other)

4. 无序关联容器(unordered_set/map 及 multi 变体,哈希表)

查找/存在性:

  • find / count / contains(均摊 O(1))

插入/删除/访问:

  • insert / emplace / erase

  • operator[] / at(仅 unordered_map 系)

桶与负载因子(哈希特有):

  • bucket_count() / bucket(key) / bucket_size(i)

  • load_factor() / max_load_factor(f)

  • rehash(n) / reserve(n):控制扩容

  • 注意:rehash/reserve 会让所有迭代器失效(引用通常仍有效)。

5. 容器适配器

stack

  • push/emplace,pop,top,size,empty

queue

  • push/emplace,pop,front,back,size,empty

priority_queue

  • push/emplace(O(log n)),pop(O(log n)),top(O(1)),size,empty

6. 常见注意事项

  • map::operator[] 会插入默认值;只读请用 find/at/contains。

  • vector 中间 insert/erase 或扩容会让大量迭代器/引用失效。

  • unordered_* 的 rehash/reserve 使所有迭代器失效。

  • 链表成员算法(list::splice/merge/sort/unique)是成员函数,不是 里的自由函数。

4. stl容器单讲链接

  • 预留,更新后会填上文章地址
  1. vector:C++ 标准模板库(Standard Template Library,STL)之vector详解
  2. list:
  3. deque:
  4. set/multiset/unordered_set:
  5. map/multimap/unordered_map:
  6. stack/queue/priority_queue:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值