HoRain云--C++STL教程:从入门到精通 HoRain 云小助手个人主页⛺️生活的理想就是为了理想的生活!⛳️ 推荐前些天发现了一个超棒的服务器购买网站性价比超高大内存超划算忍不住分享一下给大家。点击跳转到网站。目录⛳️ 推荐 C STL 教程从能跑到不踩坑 STL 三大件一句话 六大容器家族速查1️⃣ vector—— 动态数组≈ Java ArrayList2️⃣ list—— 双向链表≈ Java LinkedList3️⃣ deque—— 双端队列Java 没有严格对等4️⃣ map—— 红黑树≈ Java TreeMap5️⃣ unordered_map—— 哈希表≈ Java HashMap6️⃣ set/ unordered_set—— 只存 key 不存 value 迭代器C 独有概念Java 只有 Iterator一种️ 算法 STL 的精华 string—— 不是 STL 容器但像容器⚠️ 迭代器失效C 特有Java 没有这坑 跟 Java 集合对照表你前面 Java LinkedList/String 都看过 一段能打的综合示例 学习路线建议 C STL 教程从能跑到不踩坑STLStandard Template Library是 C 的武器库你前面看完类/多态/动态内存STL 是下一块——它跟 Java 集合框架Collections Framework能对上但 C 多了迭代器 算法分离这套设计是 C 特有的味道。 STL 三大件一句话组件干嘛的类比 Java容器Containers​存数据ArrayList,HashMap...算法Algorithms​操作数据sort,find...Collections.sort(), Stream API迭代器Iterators​容器和算法之间的胶水IteratorC 的设计哲学容器只管存算法只管算迭代器把它们粘起来。Java 的ArrayList.sort()是把算法绑在容器上的两套思路。 六大容器家族速查1️⃣vector—— 动态数组≈ JavaArrayList最常用没有之一。连续内存随机访问 O(1)尾插 O(1) 均摊。#include vector #include iostream std::vectorint v {1, 2, 3}; v.push_back(4); // 尾插 O(1) v.emplace_back(5); // 比 push_back 更高效就地构造 std::cout v[2]; // 3不越界检查 std::cout v.at(10); // 抛 std::out_of_range慢一点但安全 // 遍历 for (int x : v) std::cout x ; // range-forC11emplace_backvspush_backpush_back(T(val))是先构造临时对象再移动emplace_back(val)直接在容器里构造少一次拷贝/移动对象重时明显。2️⃣list—— 双向链表≈ JavaLinkedList#include list std::listint lst {1, 2, 3}; lst.push_front(0); // 头插 O(1) lst.push_back(4); // 尾插 O(1) lst.reverse(); // 链表专属list没有[]随机访问要取第 i 个得std::advance(it, i)走 i 步 O(n)。3️⃣deque—— 双端队列Java 没有严格对等头尾插删都 O(1)比vector多一个头插能力比list多随机访问。#include deque std::dequeint dq; dq.push_front(1); dq.push_back(2); std::cout dq[0]; // 1能随机访问stack/queue底层默认用deque。4️⃣map—— 红黑树≈ JavaTreeMap按键有序O(log n) 查插删。#include map #include string std::mapstd::string, int scores { {Alice, 90}, {Bob, 85} }; scores[Charlie] 95; // 插入/修改 int a scores[Alice]; // 90不存在会插入默认值 // 安全查 if (scores.contains(Dave)) { // C20 // ... } auto it scores.find(Dave); // C11 起最佳做法 if (it ! scores.end()) { // ... }5️⃣unordered_map—— 哈希表≈ JavaHashMap无序平均 O(1)比map快但要算 hash。#include unordered_map std::unordered_mapstd::string, int um { {Apple, 10}, {Banana, 5} }; um[Orange] 8; std::cout um[Apple]; // 10 选型要顺序/范围查询 →map要纯 KV 查 →unordered_map。跟 Java 的TreeMapvsHashMap完全同逻辑。6️⃣set/unordered_set—— 只存 key 不存 value#include set std::setint s {3, 1, 2}; s.insert(4); for (int x : s) std::cout x ; // 1 2 3 4有序 迭代器C 独有概念Java 只有Iterator一种std::vectorint v {10, 20, 30}; // 经典写法 for (auto it v.begin(); it ! v.end(); it) { std::cout *it ; } // C11 range-for底层就是迭代器 for (int x : v) { std::cout x ; } // C20 ranges更爽但先不展开迭代器分类面试会问输入 / 输出单向只读/只写前向单向可读写双向--it也能走list,map,set随机访问it 5,it1 - it2vector,deque,stringvector的迭代器就是指针list的迭代器是节点指针包装——所以vector能随机访问list不能。️ 算法algorithmSTL 的精华#include algorithm #include vector #include iostream std::vectorint v {3, 1, 4, 1, 5}; // 排序 std::sort(v.begin(), v.end()); // 升序 std::sort(v.begin(), v.end(), std::greaterint()); // 降序 // 查找 auto it std::find(v.begin(), v.end(), 4); // 返回迭代器 if (it ! v.end()) std::cout found\n; // 计数 int cnt std::count(v.begin(), v.end(), 1); // 2 // 遍历修改C11 lambda std::for_each(v.begin(), v.end(), [](int x) { std::cout x ; }); // 变换到新容器 std::vectorint doubled(v.size()); std::transform(v.begin(), v.end(), doubled.begin(), [](int x) { return x * 2; });跟 Java 对比std::sort(v.begin(), v.end())≈Collections.sort(list)但 C 的算法是独立于容器的——同一个sort能排vector/deque/ 原生数组只要给随机访问迭代器。string—— 不是 STL 容器但像容器你前面看了 JavaString不可变Cstd::string是可变的这点最容易被 Java 人搞混。#include string std::string s hello; s , world; // ✅ 可变Java 这步要 new s[0] H; // Hello, world // 常用 s.size(); // 长度 s.empty(); // 是否空 s.substr(0, 5); // Hello左闭右开 s.find(world); // 7没找到返回 std::string::npos // C14 起 string 也是连续存储能当 vectorchar 用但语义更清楚⚠️ Cstd::string≠ JavaStringJava 不可变常量池C 可变值语义可reserve()。混着记会踩坑。⚠️ 迭代器失效C 特有Java 没有这坑改容器结构可能导致迭代器作废——这是 STL 最容易翻车的地方。std::vectorint v {1, 2, 3, 4, 5}; for (auto it v.begin(); it ! v.end(); it) { if (*it 3) { v.erase(it); // ❌ it 已失效下次 it UB } } // ✅ 正确erase 返回下一个有效迭代器 for (auto it v.begin(); it ! v.end(); ) { if (*it 3) { it v.erase(it); // erase 返回下一个 } else { it; } }各容器失效规则速记操作vectordequelistmap/setunordered_*尾插尾 iter 可能失效全有效全有效全有效可能全失效rehash中间删被删及之后失效被删及之后失效只被删失效只被删失效只被删失效一句话vector最娇气list/map最稳unordered_*rehash 时全炸。 跟 Java 集合对照表你前面 Java LinkedList/String 都看过C STLJava 集合备注vectorArrayList连续数组随机访问listLinkedList双向链表deque无严格对等ArrayDeque接近但不支持随机访问mapTreeMap红黑树有序unordered_mapHashMap哈希无序set/unordered_set无直接对等HashSet是HashMap的马甲sort()Collections.sort()C 算法独立于容器stringStringStringBuilderC 可变Java String 不可变 一段能打的综合示例#include iostream #include vector #include unordered_map #include algorithm #include string struct Student { std::string name; int score; }; int main() { std::vectorStudent students { {Alice, 90}, {Bob, 85}, {Charlie, 95} }; // 按分数降序 std::sort(students.begin(), students.end(), [](const Student a, const Student b) { return a.score b.score; }); // 统计分数分布 std::unordered_mapint, int dist; for (const auto s : students) { dist[s.score / 10 * 10]; // 90分段、80分段... } for (const auto [range, cnt] : dist) { std::cout range - range9 : cnt \n; } } 学习路线建议STL 不用背全一百多个算法没人全记得容器会挑 迭代器懂失效 算法记sort/find/transform就够 80% 场景。顺着你这条线类 → 抽象 → 多态 → 动态内存 → STL下一块自然落到C11 新特性auto、lambda、范围 for、智能指针你已经看过一部分或者STL 源码浅读vector扩容 /unordered_map冲突——前者偏写代码爽后者偏面试八股。要哪边❤️❤️❤️本人水平有限如有纰漏欢迎各位大佬评论批评指正如果觉得这篇文对你有帮助的话也请给个点赞、收藏下吧非常感谢! Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧

相关新闻

最新新闻

​从纸质台账到数智中台:合同管理系统的演进与未来​

​从纸质台账到数智中台:合同管理系统的演进与未来​

合同作为企业商业交易与合规运营的核心载体,其管理模式迭代紧跟数字化转型步伐。合同管理系统历经数十年发展,从单一文档存储工具,转变为贯通业务、财务、法务的企业经营数据底座,推动管理效率与合规风控能力持续升级。 早…

2026/7/4 4:50:37
合同全生命周期管理软件经验分享-需求

合同全生命周期管理软件经验分享-需求

本期开个帖子,分享一下合同全生命周期管理的相关经验,给各位有这方面需求的同仁提供一些参考。我们先从需求方(以下简称“甲方”)的角度出发,明确合同管理中的核心要求。在实际场景中,我们常遇到这样的情况…

2026/7/4 4:50:37
雅马哈工业机械手:高精度运动控制与模块化设计解析

雅马哈工业机械手:高精度运动控制与模块化设计解析

1. 工业自动化领域的革新力量 在汽车制造车间里,一台六轴机械手正以惊人的精度完成车身焊接作业,每个焊点的误差不超过0.02毫米;在电子装配线上,另一组机械手以每分钟120次的速度精准贴装微型元器件。这些场景中的主角&#xff0c…

2026/7/4 4:50:37
深入解析 MinIO:2026 年自建对象存储的首选,轻量、高性能、S3 兼容

深入解析 MinIO:2026 年自建对象存储的首选,轻量、高性能、S3 兼容

在现代开发中,图片、视频、日志、备份、AI 训练文件等非结构化数据越来越多。传统的本地文件系统、FTP、FastDFS 等方案,在扩展性、高可用、云原生支持上越来越吃力。 而 MinIO,正是为解决这些问题而生 ——开源、轻量、分布式、S3 兼容、高性能,是目前企业自建对象存储的…

2026/7/4 4:50:37
旋变传感器标定全攻略:从原理到对零实操,工程师一看就会

旋变传感器标定全攻略:从原理到对零实操,工程师一看就会

旋变传感器标定全攻略:从原理到对零实操,工程师一看就会 一、先搞懂:旋变为什么必须标定? 很多人把旋变和旋转编码器混为一谈,其实两者定位完全不同: 旋转编码器:输出数字脉冲,精度高…

2026/7/4 4:50:37
LLC设计指南(九)第九章:真正开始讲 LLC 的变压器——为什么它比 Flyback 难十倍?

LLC设计指南(九)第九章:真正开始讲 LLC 的变压器——为什么它比 Flyback 难十倍?

第九章:真正开始讲 LLC 的变压器——为什么它比 Flyback 难十倍? 如果说: Lr Lm Cr是 LLC 的灵魂。 那么: 变压器就是 LLC 的心脏。 很多工程师第一次做 LLC。 最大的误判是: “变压器嘛,不就是隔离、变压?” 结果: 打样回来: 频率飘 效率低 发热 轻载啸叫 ZVS …

2026/7/4 4:45:37

周新闻

月新闻