news 2026/5/1 10:06:45

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/5/1 7:18:43

逆向工程入门指南:什么是逆向?它能做什么?→建议收藏!

1.逆向工程 逆向工程又被称为反求工程(Reverse Engineering)&#xff0c;是一种再现产品设计技术的过程&#xff0c;通过对给定的产品进行逆向研究与分析&#xff0c;从而得出该产品的相关参数及特性&#xff0c;以制造出结构相近、性能更优秀的产品模型。利用三维扫描仪获取被…

作者头像 李华
网站建设 2026/5/1 6:01:58

2026年暴露面检测 vs 漏洞扫描:本质差异与协同防御实战指南

暴露面检测与漏洞扫描的本质差异目标范围不同 暴露面检测聚焦于识别所有面向互联网的资产&#xff08;如IP、域名、API、云服务&#xff09;&#xff0c;包括未知或影子IT资产&#xff0c;强调攻击面的广度。漏洞扫描针对已知资产的已知漏洞&#xff08;如CVE编号漏洞&#xff…

作者头像 李华
网站建设 2026/5/1 6:52:53

Nodejs和vue框架的短剧推荐系统设计与实现--论文

目录 摘要 关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 摘要 随着短视频和网络剧的快速发展&#xff0c;用户对个性化推荐系统的需求日益增长。本文基于Node.js和Vue框架设计并…

作者头像 李华
网站建设 2026/5/1 6:53:35

第一章:Go语言概述与环境搭建-核心特性解析

Go语言核心特性解析&#xff1a;为什么它是“互联网时代的C语言”&#xff1f;当Python的灵活遇上C的性能&#xff0c;再注入原生的并发基因&#xff0c;这便是Go语言征服云计算时代的独特配方。Go语言作为一门相对年轻但发展迅猛的编程语言&#xff0c;正在重塑后端开发、云计…

作者头像 李华
网站建设 2026/5/1 6:56:04

全链路开发指南:DApp+公链+钱包+Swap 如何打通?

“开发的DApp无法对接主流钱包”“Swap模块上线后出现滑点异常”“跨链交易频繁失败”——在Web3全链路开发中&#xff0c;这类问题让不少团队栽了跟头。2025年&#xff0c;“DApp公链/主链钱包Swap”的组合已成为行业主流形态&#xff0c;其核心价值在于构建“用户入口-资产流…

作者头像 李华