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 道阻且长,行则将至,让我们一起加油吧

相关新闻

最新新闻

AI编程助手评测:SlopCodeBench榜单解读与Fable 5、GPT-5.6-Sol、Kimi K3对比

AI编程助手评测:SlopCodeBench榜单解读与Fable 5、GPT-5.6-Sol、Kimi K3对比

最近,AI编程助手领域又迎来了一轮新的“跑分”竞赛。如果你正在为团队选型,或者纠结于哪个模型更适合自己的开发工作流,那么SlopCodeBench这个新出炉的榜单,以及上面Fable 5、GPT-5.6-Sol和Kimi K3这几个名字,绝对值得…

2026/8/8 3:33:10
Flutter Riverpod 在 build 期改 provider 导致整页崩溃,踩坑实录

Flutter Riverpod 在 build 期改 provider 导致整页崩溃,踩坑实录

Flutter Riverpod 在 build 期改 provider 导致整页崩溃,踩坑实录 作者:FungLeo | 适用:Flutter / Riverpod 现象:Web 端登录进首页,页面一个请求都不发,安卓真机却完全正常。 前言 说实话&…

2026/8/8 3:33:10
Qwen3.6-35B-A3B开源大模型深度评测与实战部署指南

Qwen3.6-35B-A3B开源大模型深度评测与实战部署指南

1. 项目概述:一次对开源模型“质变”的深度审视最近,AI开源社区里最热闹的话题,莫过于阿里通义千问团队发布的Qwen3.6系列模型。其中,那个参数规模达到350亿的“大家伙”——Qwen3.6-35B-A3B,更是被推到了风口浪尖。评…

2026/8/8 3:33:10
智能体开发实战:从概念到验证,构建可靠AI助手

智能体开发实战:从概念到验证,构建可靠AI助手

最近,AI 领域的热词榜几乎被“智能体”三个字刷屏。从 Coze、Dify 这类低代码平台,到各种“销售智能体”、“代码智能体”的垂直应用,似乎一夜之间,人人都能“搭建”自己的 AI 助手。然而,当 Perplexity 的 CEO Aravin…

2026/8/8 3:33:10
VGGT-Ω:用30%显存训练15倍数据,突破3D视觉大模型显存墙

VGGT-Ω:用30%显存训练15倍数据,突破3D视觉大模型显存墙

1. 从“数据墙”到“显存墙”:3D视觉大模型的现实困境如果你最近在折腾3D视觉相关的项目,无论是点云分割、三维重建还是神经渲染,大概率会和我有同样的感受:显存,永远不够用。这感觉就像你开着一辆性能强劲的跑车&…

2026/8/8 3:33:10
前端开发转行网安,靠渗透测试接私活到底靠不靠谱

前端开发转行网安,靠渗透测试接私活到底靠不靠谱

前端技能树:转行网安的天然跳板很多前端开发者在职业生涯的某个阶段,都会冒出“转行”的念头。当听到“渗透测试”、“挖漏洞”这些词汇时,第一反应往往是神秘和高深莫测,觉得那是另一套完全陌生的技术体系。但实际上,…

2026/8/8 3:28:09