news 2026/7/30 20:38:47

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/7/29 5:23:51

域名投资议题——新老顶级域的选择

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

作者头像 李华
网站建设 2026/7/28 20:55:59

基于红松APP实践,北师大彭华茂教授团队解析老年互联网学习价值

​近日&#xff0c;北京师范大学心理学部联合国内领先的退休生活兴趣社区红松&#xff0c;发布《从老有所学到老有所乐——互联网学习促进老年人心理健康的实现路径研究》&#xff08;以下简称《研究》&#xff09;。该报告深入探讨了数字化背景下老年人的学习行为与心理变迁&a…

作者头像 李华
网站建设 2026/7/27 16:11:09

彼得林奇的“价值陷阱“在新兴科技泡沫中的识别技巧

彼得林奇的"价值陷阱"在新兴科技泡沫中的识别技巧 关键词:彼得林奇、价值陷阱、新兴科技泡沫、识别技巧、投资分析 摘要:本文聚焦于彼得林奇提出的“价值陷阱”概念,深入探讨在新兴科技泡沫背景下对其的识别技巧。通过对相关核心概念的阐述、算法原理的剖析、数学…

作者头像 李华
网站建设 2026/7/28 5:55:04

数据治理和数据管理,到底有啥区别?一张图讲清楚

数据治理与数据管理&#xff1a;底层逻辑、架构差异与实践边界——一张图讲透核心区别 元数据框架 标题&#xff1a;数据治理与数据管理&#xff1a;从战略到执行的分层逻辑——用架构图拆解核心差异 关键词&#xff1a;数据治理, 数据管理, DAMA-DMBOK, 数据资产, 政策框架, 流…

作者头像 李华