留在心底的那道风景
...
C++ STL概述与入门——你的标准库第一课
什么是STLSTL(Standard Template Library,标准模板库)是C++标准库中最核心、最常用的部分。它提供了一套通用的、高效的、可复用的组件,让开发者不需要重复造轮子,就能完成绝大多数数据结构和算法相关的编程任务。 STL诞生于20世纪90年代初,由Alexander Stepanov和Meng Lee在HP实验室开发,后来被纳入C++标准。它的设计哲学是泛型编程(Generic Programming):将算法与数据类型解耦,用模板实现一套代码适配多种类型。 STL的三大组件STL的核心由三大组件构成,它们紧密配合,形成了一个强大的工具体系。 1. 容器(Containers)容器是用来存放数据的对象。你可以把它理解为”数据结构”的标准实现。STL的容器按逻辑结构可以分为三大类: 序列容器:线性排列的数据,如 vector、list、deque、array、forward_list 关联容器:基于键值对的有序数据结构,如 map、set、multimap、multiset 无序关联容器:基于哈希表的无序数据结构(C++11引入),如...
C++ STL algorithm算法库详解(下):数值计算与变换
概述继上一篇的排序与查找算法之后,本文将介绍 STL algorithm 中同样重要的数值计算和变换类算法。这些工具在日常开发中使用频率极高,熟练掌握能显著减少手写循环的代码量。 使用这些算法需要 #include <numeric>(数值算法)和 #include <algorithm>(变换算法)。 accumulate —— 累加std::accumulate 对区间内的元素依次执行累加操作。它位于 <numeric> 头文件中。 基本累加1234567891011121314151617181920#include <iostream>#include <numeric>#include <vector>int main() { std::vector<int> v = {1, 2, 3, 4, 5}; // 基本用法:求和 int sum = std::accumulate(v.begin(), v.end(), 0); ...
C++ STL deque详解:双端队列的原理与实践
什么是 deque?deque(double-ended queue,双端队列)是 C++ STL 中一个非常实用的序列容器。它的名字就说明了核心特性:可以在两端高效地进行插入和删除操作。 与 vector 只能在尾部高效操作不同,deque 在头部和尾部都能做到 O(1) 的插入和删除,这让它在很多场景下比 vector 更加灵活。 12345678910111213141516171819202122232425262728293031#include <iostream>#include <deque>int main() { std::deque<int> dq; // 尾部操作 dq.push_back(1); dq.push_back(2); dq.push_back(3); // 头部操作 dq.push_front(0); dq.push_front(-1); for (int x : dq) { std::cout...
C++ STL algorithm算法库详解(上):排序与查找
概述<algorithm> 是 C++ STL 中最庞大的头文件之一,提供了 100+ 个通用算法。掌握这些算法能极大提升编码效率。本文将重点讲解最常用的排序和查找类算法。 所有算法都通过迭代器操作容器,与具体容器类型解耦——这就是 STL 算法的精髓。 sort —— 排序std::sort 是最常用的排序算法,底层通常是 Introsort(快速排序 + 堆排序 + 插入排序的混合),平均复杂度 **O(n log n)**。 基本用法12345678910111213141516#include <iostream>#include <algorithm>#include <vector>int main() { std::vector<int> v = {5, 2, 8, 1, 9, 3, 7, 4, 6}; // 默认升序 std::sort(v.begin(), v.end()); for (int x : v) { ...
C++ STL map与unordered_map详解:有序与无序的抉择
概述map 和 unordered_map 是 C++ STL 中最常用的关联容器,都提供键值对的存储和快速查找。但它们的底层实现完全不同,适用的场景也各有侧重。 简单来说: map:基于红黑树,按键有序 unordered_map:基于哈希表,按键无序,查找更快 123456789101112131415161718192021222324252627282930313233#include <iostream>#include <map>#include <unordered_map>int main() { // map:按键升序排列 std::map<std::string, int> m; m["banana"] = 3; m["apple"] = 5; m["cherry"] = 2; std::cout << "map (有序):" <<...
C++ STL list详解——双向链表的威力与陷阱
前言std::list 是STL提供的双向链表容器。与 vector 不同,list 不支持随机访问,但在任意位置的插入和删除操作都是O(1)的。本文将详细讲解 list 的用法、特有操作,以及何时该选择 list 而非 vector。 基本用法12345678910111213141516171819202122232425262728293031#include <iostream>#include <list>int main() { // 创建与初始化 std::list<int> l1; // 空链表 std::list<int> l2(5, 10); // 5个10 std::list<int> l3 = {1, 2, 3, 4}; // 列表初始化 std::list<int> l4(l3.begin(), l3.end()); // 迭代器范围 ...
C++ STL set与unordered_set详解:集合的优雅运用
概述set 和 unordered_set 是 C++ STL 中的集合容器,与 map 的区别在于它们只存储 key,不存储 value。它们的核心功能是: 自动去重:相同的元素只会存在一份 快速查找:判断元素是否存在 1234567891011121314151617181920#include <iostream>#include <set>#include <unordered_set>int main() { std::set<int> s = {3, 1, 4, 1, 5, 9, 2, 6, 5}; // 自动去重+排序 std::cout << "set: "; for (int x : s) { std::cout << x << " "; // 1 2 3 4 5 6 9 } std::cout <<...
C++ STL vector详解——动态数组的方方面面
前言std::vector 是STL中最常用的序列容器,它是一个动态数组,能够在运行时自动调整大小。vector 在尾部插入和删除元素的时间复杂度为均摊O(1),随机访问为O(1),是最通用的容器选择。 基本用法创建与初始化12345678910111213141516#include <iostream>#include <vector>int main() { std::vector<int> v1; // 空vector std::vector<int> v2(5); // 5个默认值(0) std::vector<int> v3(5, 42); // 5个42 std::vector<int> v4 = {1, 2, 3, 4}; // 列表初始化 std::vector<int> v5(v4.begin(), v4.end()); //...
C++ STL stack与queue详解:适配器模式下的栈与队列
概述stack、queue 和 priority_queue 在 C++ STL 中有一个特殊的身份——它们不是独立容器,而是容器适配器(Container Adapter)。 这意味着它们没有自己的底层存储,而是基于其他容器(默认 deque)实现的。它们通过限制底层容器的接口,只暴露特定操作,从而实现栈和队列的语义。 123456789101112 ┌─────────┐ │ stack │ 只允许顶部操作 ├─────────┤ │ queue │ 只允许两端操作 ├─────────┤ │priority │ 只允许顶部操作(优先级) │ _queue │ └────┬────┘ │ 适配┌──────┴──────┐│ deque/vector │ (底层容器)└─────────────┘ stack —— 栈栈是后进先出(LIFO, Last In First Out)的数据结构。就像一摞盘子,最后放上去的最先被拿走。 123456789101112131415161718192021222324#include...
