随笔分类 -  C++ / STL

摘要:配接器 STL 配接器(Adapters)概览 STL 中的 配接器(adapter) 是一种设计模式,用于将某个组件的接口转换成另一种接口,从而实现不同组件间的协作。它的作用类似“轴承”或“转换器”,让原本不兼容的类能够一起运作。 STL 的配接器可分为三大类: 类型 作用对象 功能 Contai 阅读全文
posted @ 2025-08-16 18:27 _Sylvan 阅读(26) 评论(0) 推荐(0)
摘要:仿函数 STL 中的仿函数(Functors / Function Objects) 名称来源 Functors(仿函数):早期命名,中文翻译独特、形象。 Function Objects(函数对象):C++ 标准采用的正式名称,更贴切其“对象具有函数特质”的本质。 概念 仿函数是一个行为类似函数的 阅读全文
posted @ 2025-08-16 18:27 _Sylvan 阅读(82) 评论(0) 推荐(0)
摘要:算法的泛化过程 传统做法:写一个针对某种特定容器的算法,例如在 array 中查找特定值。 缺点:算法过于依赖容器实现细节(如数组大小 arraysize),无法复用。 基础版本:array 专用 find int* find(int* arrayHead, int arraySize, int v 阅读全文
posted @ 2025-08-16 18:26 _Sylvan 阅读(19) 评论(0) 推荐(0)
摘要:hashtable Hashtable 的桶(buckets)与节点(nodes) 在 SGI STL 的源码中,哈希表内部的数组单元称为桶(bucket)。 每个桶不仅是一个简单的节点,而是维护了一个链表(linked list),存储所有哈希值映射到该桶的元素。 链表中的每个元素称为节点(nod 阅读全文
posted @ 2025-08-10 12:57 _Sylvan 阅读(25) 评论(0) 推荐(0)
摘要:hashtable 前置知识 二叉搜索树(BST):平均时间复杂度是对数级 O(log n),但前提是假设输入数据有足够随机性。 红黑树(RB-tree):一种高效的平衡二叉搜索树,STL set / map 底层采用。 hashtable(散列表):在插入、删除、查找等操作上,可以实现常数平均时间 阅读全文
posted @ 2025-08-10 12:57 _Sylvan 阅读(29) 评论(0) 推荐(0)
摘要:RB-Tree(下) RB-tree的构造与内存管理 RB-tree 定义了一个专用的空间分配器 rb_tree_node_allocator,它的分配策略是——每次只分配恰好一个节点的空间。 // 红黑树类模板定义 template <class Key, // 键类型(红黑树的排序依据) cla 阅读全文
posted @ 2025-08-10 12:54 _Sylvan 阅读(21) 评论(0) 推荐(0)
摘要:RB-Tree(上) RB-tree(红黑树)是加了平衡条件的二叉搜索树,需满足以下规则: 每个节点非红即黑。 根节点是黑色。 红节点不能有红色子节点(即不能连续红)。 从任一节点到其所有 NULL(叶端)路径上的黑节点数相同。 这些路径是指:从某个节点出发,往下走到“空指针”结束(即 NULL 节 阅读全文
posted @ 2025-08-10 12:54 _Sylvan 阅读(47) 评论(0) 推荐(0)
摘要:RB-Tree 前置知识 二叉搜索树 二叉树 二叉树(binary tree) 是一种每个节点最多有两个子节点的数据结构,分别称为左子节点和右子节点。可以用递归方式定义:一个非空二叉树由一个根节点和左右子树组成,左右子树本身也是二叉树,且可以为空。 二叉树用途广泛,例如表达式树、哈夫曼编码树等都属于 阅读全文
posted @ 2025-08-10 12:49 _Sylvan 阅读(16) 评论(0) 推荐(0)
摘要:heap Heap 概述 Heap 并不属于 STL 的容器组件,它更像是一个“幕后英雄”,是 priority_queue(优先队列)的底层支撑。 什么是 Priority Queue? 优先队列允许用户以任意顺序插入元素,但取出元素时总是优先级最高的先出(通常数值最大)。 这非常符合 Binar 阅读全文
posted @ 2025-08-10 12:41 _Sylvan 阅读(31) 评论(0) 推荐(0)
摘要:迭代器与 traits 编程技法 迭代器(Iterator)是 STL 的灵魂,它是一种通用指针机制,提供统一的方式来遍历容器中的元素。它允许算法与容器解耦。你可以将算法用于任何支持相同迭代器接口的容器上。 在 C++ STL 中,迭代器是一种对象,它重载了解引用 * 和自增 ++ 操作符,使得用户 阅读全文
posted @ 2025-07-20 19:35 _Sylvan 阅读(31) 评论(0) 推荐(0)
摘要:空间配置器 SGI STL 中的 空间配置器(allocator) 是 STL 容器使用内存的核心组件。 在《STL 源码剖析》中,侯捷将其拆解为: 一级配置器(__malloc_alloc_template):大对象,直接调用 malloc/free 二级配置器(__default_alloc_t 阅读全文
posted @ 2025-07-20 19:35 _Sylvan 阅读(34) 评论(0) 推荐(0)
摘要:multimap std::multimap 是 C++ STL 中的关联容器,它与 std::map 类似,但允许多个相同的键(key)存在。它存储的是键值对(key-value),并且 key 不唯一,但 按 key 排序,每个 key 可以关联多个不同的 value。 基本特性 键允许重复:s 阅读全文
posted @ 2025-07-20 19:34 _Sylvan 阅读(196) 评论(0) 推荐(0)
摘要:multiset std::multiset 是 C++ STL 中的关联容器,与 std::set 类似,但它允许容器中存储重复的元素。multiset 元素是按特定顺序排列的,默认按照升序排序,底层通常使用红黑树来实现。 基本特性 元素可重复:与 std::set 不同,std::multise 阅读全文
posted @ 2025-07-20 19:33 _Sylvan 阅读(95) 评论(0) 推荐(0)
摘要:set set 是一个基于平衡二叉搜索树(如红黑树)的容器。它会自动对元素进行排序,且保证每个元素在集合中唯一。因为元素是有序的,所以查找、插入和删除的时间复杂度都是 O(log N)。 主要特性: 唯一性:set 中的元素不允许重复。 自动排序:元素会自动按照升序排序,如果需要自定义排序规则,可以 阅读全文
posted @ 2025-07-20 19:32 _Sylvan 阅读(55) 评论(0) 推荐(0)
摘要:map std::map 是一个关联容器,以 键值对(key-value) 形式存储数据,具有以下特性: 键是唯一的(key 不可重复) 元素按 key 自动排序(默认升序) 插入、删除、查找等操作的时间复杂度为 O(logN) 底层实现 std::map 底层基于红黑树(Red-Black Tre 阅读全文
posted @ 2025-07-20 19:32 _Sylvan 阅读(27) 评论(0) 推荐(0)
摘要:容器体系结构 STL 容器的整体分类 C++ STL 中的容器可以分为三大类: 容器类型 代表容器 简介 序列容器 vector, deque, list, array, forward_list 元素按插入顺序排列 关联容器 set, map, multiset, multimap 自动排序、基于 阅读全文
posted @ 2025-07-20 19:31 _Sylvan 阅读(46) 评论(0) 推荐(0)
摘要:unordered_map std::unordered_map 是 C++11 引入 的关联容器,实现了 哈希表(Hash Table)。它基于key-value 对存储数据,通过哈希函数将 key 映射到桶数组(bucket)的位置,支持快速插入、查找、删除。 底层原理 数据结构 底层主要由: 阅读全文
posted @ 2025-07-20 19:31 _Sylvan 阅读(185) 评论(0) 推荐(0)
摘要:unordered_set std::unordered_set 是一个 存储唯一元素 的集合容器,其特点是: 元素无序(内部使用哈希表) 不允许重复元素 插入、查找、删除操作的 平均时间复杂度为 O(1) 典型使用场景: 判断是否存在某元素(查重) 快速去重 实现集合的“集合运算”:并集、交集、差 阅读全文
posted @ 2025-07-20 19:31 _Sylvan 阅读(202) 评论(0) 推荐(0)
摘要:string std::string 是 C++ 标准库中用于表示和操作字符串的类,实质上是 std::basic_string<char> 的一个特化。它封装了字符数组,提供了丰富的字符串操作接口。 属于序列容器的特殊类型,支持迭代器、索引访问。 主要用于存储和管理可变长度的字符序列。 底层原理 阅读全文
posted @ 2024-08-28 16:57 _Sylvan 阅读(71) 评论(0) 推荐(0)
摘要:priority_queue std::priority_queue 是 STL 提供的容器适配器,实现了一个最大堆(默认)或最小堆的数据结构,用于快速访问“优先级最高”的元素。 默认行为是:堆顶元素最大(max heap)。 底层原理 底层基于 vector + make_heap/push_he 阅读全文
posted @ 2024-08-20 23:31 _Sylvan 阅读(149) 评论(0) 推荐(0)