news 2026/4/15 11:18:53

STL 核心概念与组成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STL 核心概念与组成

STL(Standard Template Library)是 C++ 标准库的核心部分,本质是一套通用的、可复用的模板类和函数,目的是让开发者不用重复造轮子,直接使用成熟的数据结构和算法。

STL 主要由以下六大组件构成,其中容器、算法、迭代器是最核心的三大件:

组件作用
容器(Container)存储数据的类模板,如数组、链表、栈、队列、集合等
算法(Algorithm)操作容器中数据的函数模板,如排序、查找、遍历、交换、删除等
迭代器(Iterator)连接容器和算法的 "桥梁",本质是类模板,提供类似指针的方式访问容器元素
仿函数(Functor)重载()运算符的类,可作为算法的参数(类似函数指针,但更灵活)
适配器(Adapter)包装已有组件,改变其接口或行为(如栈 stack 是对 deque 的适配器)
分配器(Allocator)负责容器的内存分配与释放(通常无需手动操作,STL 默认实现足够好用)

一、核心组件详解(附实用代码示例)

1. 容器(最常用部分)

容器分为三类:序列式容器(元素有序,可按索引访问)、关联式容器(元素按关键字排序,查找效率高)、无序关联式容器(C++11 新增,哈希表实现)。

(1)序列式容器示例

cpp

运行

#include <iostream> // 包含对应容器的头文件 #include <vector> // 动态数组(最常用) #include <list> // 双向链表 #include <deque> // 双端队列 #include <stack> // 栈(适配器) #include <queue> // 队列(适配器) using namespace std; int main() { // 1. vector(动态数组,随机访问快,尾部增删快) vector<int> vec = {1, 2, 3, 4, 5}; vec.push_back(6); // 尾部添加元素 cout << "vector第3个元素:" << vec[2] << endl; // 随机访问(索引从0开始) // 遍历vector(迭代器方式) cout << "vector遍历:"; for (vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) { cout << *it << " "; } cout << endl; // 2. stack(栈,后进先出LIFO) stack<int> st; st.push(10); st.push(20); cout << "栈顶元素:" << st.top() << endl; // 获取栈顶 st.pop(); // 弹出栈顶(无返回值) cout << "弹出后栈顶:" << st.top() << endl; // 3. queue(队列,先进先出FIFO) queue<int> q; q.push(100); q.push(200); cout << "队首元素:" << q.front() << endl; // 获取队首 q.pop(); // 弹出队首 cout << "弹出后队首:" << q.front() << endl; return 0; }
(2)关联式 / 无序容器示例

cpp

运行

#include <iostream> #include <map> // 有序键值对(红黑树) #include <unordered_map> // 无序键值对(哈希表,C++11) #include <set> // 有序不重复集合 using namespace std; int main() { // 1. map(键唯一,自动按键升序排列) map<string, int> score; score["张三"] = 90; score["李四"] = 85; score.insert({"王五", 95}); // 另一种插入方式 // 遍历map cout << "map遍历:" << endl; for (auto it = score.begin(); it != score.end(); ++it) { cout << it->first << ": " << it->second << endl; } // 2. unordered_map(哈希表,查找效率更高,无序) unordered_map<string, int> umap = {{"苹果", 5}, {"香蕉", 3}}; cout << "香蕉价格:" << umap["香蕉"] << endl; // 3. set(元素唯一,自动升序) set<int> s = {3, 1, 4, 1, 2}; // 重复元素会被自动去重 cout << "set遍历:"; for (int num : s) { // 范围for遍历(C++11) cout << num << " "; } cout << endl; return 0; }
2. 算法(Algorithm)

STL 算法是全局函数,定义在<algorithm>头文件中,可直接操作容器元素,无需关心容器底层实现。

cpp

运行

#include <iostream> #include <vector> #include <algorithm> // 算法头文件 using namespace std; // 自定义比较函数(降序排序) bool cmp(int a, int b) { return a > b; } int main() { vector<int> vec = {5, 2, 9, 1, 5, 6}; // 1. 排序(sort) sort(vec.begin(), vec.end()); // 默认升序 cout << "升序排序后:"; for (int num : vec) cout << num << " "; cout << endl; sort(vec.begin(), vec.end(), cmp); // 自定义降序 cout << "降序排序后:"; for (int num : vec) cout << num << " "; cout << endl; // 2. 查找(find) auto it = find(vec.begin(), vec.end(), 5); if (it != vec.end()) { cout << "找到5,索引:" << it - vec.begin() << endl; } // 3. 计数(count) int cnt = count(vec.begin(), vec.end(), 5); cout << "5出现的次数:" << cnt << endl; // 4. 反转(reverse) reverse(vec.begin(), vec.end()); cout << "反转后:"; for (int num : vec) cout << num << " "; cout << endl; return 0; }
3. 迭代器(Iterator)

迭代器是容器和算法的 "桥梁",不同容器的迭代器用法基本一致,核心类型:

  • begin():指向第一个元素的迭代器
  • end():指向最后一个元素下一个位置的迭代器(尾后迭代器,不可解引用)
  • cbegin()/cend():常量迭代器(C++11,不可修改元素)

总结

  1. STL 核心是容器(存数据)、算法(操作数据)、迭代器(连接两者),基于模板实现,支持通用编程。
  2. 常用容器中,vector(动态数组)是最基础且高频使用的,map/unordered_map适合键值对场景,stack/queue适合特定的存取规则。
  3. STL 算法(如sortfind)无需重复编写,直接调用即可,注意需包含<algorithm>头文件,且算法操作的是迭代器范围。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/8 13:03:56

如何永久删除安卓设备中的照片(已验证)

当你从 Android 手机中删除照片时&#xff0c;它们通常并没有真正消失。它们可能残留在“最近删除”相册、云备份中&#xff0c;或者可以通过专门的工具恢复。本指南将引导你使用几种方法永久删除 Android 设备上的照片&#xff0c;确保你的私人照片保持私密。快速浏览一下这些…

作者头像 李华
网站建设 2026/4/10 10:22:55

什么是PFC

文章目录为什么需要PFCPFC是如何工作的rPFCPFC&#xff08;Priority-based Flow Control&#xff09;的含义是基于优先级的流量控制&#xff0c;它是目前应用最广泛的能够有效避免丢包的流量控制技术&#xff0c;是智能无损网络的基础。使能了PFC功能的队列&#xff0c;我们称之…

作者头像 李华
网站建设 2026/4/11 19:20:53

Python文件读取代码中strip()的作用

这行代码 line.strip() 的作用是&#xff1a; 主要功能 去除字符串 line 两端的空白字符。 具体会去除的字符包括&#xff1a; 空格 (space, )换行符 (newline, \n)回车符 (carriage return, \r)制表符 (tab, \t)其他空白字符&#xff08;如垂直制表符等&#xff09; 在这个具…

作者头像 李华
网站建设 2026/4/10 1:40:27

别再层层嵌套公式了!升级下Excel,秒变专业级Access!

现在还在Excel里一层一层套公式的人&#xff0c;心里大多都有数&#xff1a;这条路越来越难走了。只是很多人憋着一股劲&#xff0c;不敢直接说出口。一张表&#xff0c;为什么会越做越不对劲&#xff1f;刚开始做Excel的时候&#xff0c;其实都很顺。录数据、算合计、拉数据透…

作者头像 李华
网站建设 2026/4/15 3:43:02

mysql “黑名单“

目的&#xff1a;使用iptables禁止121.43.122.130客户端连接140.143.94.243机器上部署的mysql部署MySQL的机器客户端140.143.94.243121.43.122.130安装 iptables-services&#xff08;若没装&#xff09;yum install -y iptables-services让 systemd 接管iptablessystemctl sta…

作者头像 李华