【C++ STL】
文章平均质量分 77
参考侯捷老师《STL源码剖析》
越甲八千
置身其中,全力以赴
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
std::vector<>.emplace_back
(而非拷贝或移动)元素。这一特性显著提升了复杂对象的插入效率,尤其适用于构造代价较高的类型。是 C++11 引入的容器成员函数,用于在容器尾部。:若构造函数抛出异常,容器状态保持不变。不返回新元素的引用(C++17 起。在现代 C++ 编程中,建议优先使用。,除非需要明确的类型检查或兼容性保证。:若容器需要重新分配内存,仍需移动所有现有元素。原创 2025-05-20 23:10:31 · 1124 阅读 · 0 评论 -
vector是在栈上还是在堆上
在C++中,std::vector对象的存储位置取决于其定义方式:如果作为局部变量或类的非静态成员变量,则存储在栈上;如果使用new动态分配,则存储在堆上。然而,vector管理的元素始终存储在堆上,因为vector需要动态调整大小,堆内存更适合这种需求。vector使用RAII机制,确保对象析构时自动释放堆上的内存,避免内存泄漏。相比之下,固定大小的数组(如std::array或原始数组)则存储在栈上。总结如下:vector对象本身可存储在栈或堆上,而其元素始终存储在堆上。原创 2025-05-13 16:27:01 · 511 阅读 · 0 评论 -
deque底层数据结构以及和queue的异同
deque(双端队列)是一种高效支持两端插入和删除操作的数据结构,常见于C++标准库(STL)等编程语言。其底层实现采用分段连续存储,结合了数组和链表的优势,既支持O(1)时间复杂度的随机访问,又能在两端进行快速插入和删除。deque由中控器(指针数组)和数据块(固定大小的数组)组成,通过迭代器实现透明的随机访问。与vector相比,deque在两端操作上更高效,且避免了扩容时的元素复制开销;与list相比,deque支持随机访问,但中间插入/删除效率较低。deque适用于需要频繁双端操作和偶尔随机访问的场原创 2025-05-12 00:52:52 · 659 阅读 · 0 评论 -
1 2 3 4 5顺序插入,形成一个红黑树
红黑树是一种自平衡的二叉搜索树,通过颜色标记和平衡性约束确保树高为O(log n)。其核心特性包括节点颜色(红或黑)、根节点和叶子节点为黑色、红色节点的子节点必须为黑色,以及从任一节点到叶子的路径包含相同数目的黑色节点。这些特性使得红黑树在插入和删除时通过颜色调整和旋转操作维持平衡,避免了普通二叉搜索树的退化问题。以顺序插入1、2、3、4、5为例,通过逐步调整和旋转,最终形成一棵符合红黑树性质的有效树结构。原创 2025-05-10 23:56:41 · 543 阅读 · 0 评论 -
为什么有了BST了,还要红黑树,红黑树有什么优点
BST(二叉搜索树)和红黑树都是常见的树形数据结构,但红黑树在某些方面对BST进行了优化,主要解决了BST在特定情况下可能出现的性能问题。虽然牺牲了一定的空间(每个节点多一个颜色位)和插入/删除时的调整开销,但在动态数据结构中表现更可靠,因此被广泛应用于各种高性能系统中。红黑树通过引入颜色标记和平衡性约束,解决了BST在特定情况下的退化问题,提供了稳定的。这种情况下,BST的效率大幅降低,无法满足高效查询的需求。,通过额外的颜色标记和平衡性约束,确保树的高度始终保持在。维持平衡,避免了BST的退化问题。原创 2025-05-10 23:52:41 · 741 阅读 · 0 评论 -
C++ set替换vector进行优化
【代码】C++ set替换vector进行优化。原创 2025-05-08 20:35:23 · 310 阅读 · 0 评论 -
STL新增内容
这些新增内容使得 STL 更加完善和强大,为 C++ 开发者提供了更多高效、便捷的工具。原创 2025-04-01 15:55:35 · 496 阅读 · 0 评论 -
std::variant` 的底层实现原理
的核心是通过手动管理存储和类型索引,结合编译时类型计算和运行时动态分派,实现类型安全的联合体。其设计平衡了类型灵活性、内存效率与异常安全性,是C++类型系统的重要扩展。原创 2025-03-17 10:09:57 · 1034 阅读 · 0 评论 -
stl里的deque 中控map 假如用完了,该如何处理
中控map本质上是一个动态数组,数组中的每个元素是一个指针,这些指针分别指向不同的存储块(缓冲区)。每个存储块是一段连续的内存,用于实际存储deque中的元素。当需要向deque中添加元素,而现有的存储块空间不足时,会创建新的存储块,并将其地址记录在中控map中。原创 2025-02-15 15:48:52 · 522 阅读 · 0 评论 -
C++ map和unordermap的区别
各有特点,在实际编程中需要根据具体的应用场景来选择使用哪一种数据结构。原创 2025-01-12 22:51:13 · 1031 阅读 · 0 评论 -
C++左值引用、右值引用、引用折叠、移动语义、完美转发
综上所述,左值引用、右值引用、引用折叠、移动语义和完美转发这些概念在 C++11 及后续版本中相互配合,为优化对象资源管理、提高代码性能以及在复杂的模板编程和函数调用场景中保证参数传递的正确性等方面发挥了重要作用,深入理解它们有助于编写更高效、灵活且符合现代 C++ 编程规范的代码。这种形式(称为“万能引用”,后面会详细解释),在实际调用时,根据传入的是左值还是右值,模板参数会进行类型推导,然后结合引用折叠规则来确定最终参数的引用类型,从而保证函数内部转发等操作能正确进行。所指向的可能大量内存数据的开销。原创 2024-08-19 16:18:24 · 252 阅读 · 0 评论 -
STL各种map比较
由于map使用红黑树实现,所以是有序存储的,因此map的key需要定义operator原创 2024-09-26 10:13:16 · 218 阅读 · 0 评论 -
总结一下数据结构 树 的种类
二叉树是一种每个节点最多有两个子节点的树结构,这两个子节点通常被称为左子节点和右子节点。二叉树可以为空树(即没有任何节点),也可以由一个根节点以及其左子树和右子树组成,左子树和右子树同样也是二叉树。1/ \2 3/ \ / \4 5 6 7这就是一个简单的二叉树示例,节点1是根节点,它有左子节点2和右子节点3,节点2又有自己的左子节点4和右子节点5等等。二叉搜索树是一种特殊的二叉树,它满足以下性质:对于树中的任意节点,其左子树中的所有节点值都小于该节点的值,其右子树中的所有节点值都大于该节点的值。原创 2024-12-25 22:28:08 · 1110 阅读 · 0 评论 -
C++ hashtable
哈希表是一种数据结构,它提供了快速的插入、查找和删除操作,其核心思想是通过一个哈希函数(Hash Function)将数据的关键键(Key)映射为一个固定长度的哈希值(Hash Value),然后利用这个哈希值来确定数据在表中的存储位置,也就是索引(Index)。总之,哈希表通过巧妙地运用哈希函数和解决哈希冲突的机制,实现了高效的数据存储、查找和删除操作,在众多领域如数据库、编译器、缓存系统等都有着广泛的应用。原创 2024-12-30 20:07:21 · 1105 阅读 · 0 评论 -
重温设计模式--C++迭代器种类和用法
它提供了一种方法来顺序访问一个聚合对象(如数组、列表、树等各种容器类型的数据结构)中的各个元素,而又无需暴露该聚合对象的内部表示原创 2024-12-23 09:07:43 · 1571 阅读 · 0 评论 -
C++函数对象(仿函数)
函数对象,也称作仿函数(Functor),本质上是一个类的对象,不过这个类重载了函数调用运算符operator(),使得该对象可以像函数一样被调用,执行特定的操作逻辑。简单来说,就是将一个类的实例当作函数来使用,这种方式在C++编程中提供了很多灵活性和功能扩展的可能性。C++的标准模板库(STL)中提供了一些预定义的函数对象,它们位于头文件中,这些函数对象可以直接使用或者作为基础来构建更复杂的函数对象。std::plus:用于执行加法运算,相当于前面示例中自定义的Add。原创 2025-01-02 13:41:34 · 542 阅读 · 0 评论 -
STL 六大组件
函数获取它被调用的次数,这种记录状态的功能是普通函数很难方便实现的,在一些需要统计操作次数、根据之前操作结果影响后续操作等场景中,函数对象就非常有用。函数对象的优势在于它可以有自己的内部状态,比如可以修改上面的。向量中的每个元素进行求平方的操作,计算结果存放到。类的对象就像一个函数一样被传递给。在多次使用这个函数对象后,可以通过。原创 2024-12-25 08:51:21 · 1151 阅读 · 0 评论 -
深入了解vector的erase
当执行 ls.erase(it);之后,迭代器it 已经失效,虽然他指向的地址是对的,但是此时,编译器已经把it当做一个失效的迭代器,此时你再对it进行++,程序将会崩溃,改成以下代码。此时erase后会返回一个新的有效的迭代器。1、vector 的erase。erase源码和简单分析如下。原创 2024-12-17 14:21:33 · 724 阅读 · 0 评论 -
深入理解STL list erase
后,it失效,再对其进行++将会导致软件崩溃,erase后返回一个新的有效的迭代器 it = ls.erase(it);1、list erase后,当前的迭代器失效,返回指向下一个节点的迭代器。list erase源码如下。原创 2024-12-17 14:34:47 · 480 阅读 · 0 评论 -
C++ STL vector基本原理和用法
vector是C++ STL中非常常用的一个容器类,它提供了动态大小的数组功能,能够自动管理所存储元素的内存分配与释放,并且支持快速的随机访问。简单来说,你可以把它看作是一种可以根据需要自动扩容和缩容的数组,使用起来比普通的C风格数组更加方便、安全和灵活,广泛应用于各种需要存储和操作一组同类型元素的场景中。基本定义定义一个vector对象的语法形式通常为std::vector 变量名;,这里的“元素类型”可以是C++中的各种基本数据类型(如intdoublechar。原创 2024-12-24 16:07:25 · 1109 阅读 · 0 评论 -
C++ STL(标准模板库)中类型萃取(Type Traits)原理
类型萃取是C++ 中一种基于模板元编程(Template Metaprogramming)的技术,它的主要目的是在编译期获取、分析和处理类型的各种特性,使得代码能够根据不同的类型特性采取不同的行为或者优化策略,即使这些类型是在编写代码时未知的(例如模板参数传入的任意类型)。通过类型萃取,C++ 可以在编译阶段对类型进行分类、查询其特定属性(如是否是内置类型、是否是指针类型、是否有特定的成员函数等),进而实现更通用、高效且灵活的代码编写。原创 2024-12-24 16:13:27 · 1068 阅读 · 0 评论 -
一级空间配置器里的oom_malloc
(Out Of Memory - )通常是在处理内存不足情况时涉及的一种机制或函数,以下是详细介绍:在C++(以及相关的C语言等环境)中,当使用像 这类函数向操作系统申请内存时,有可能会遇到内存不足的情况,导致 调用失败(返回 指针)。为了更妥善地处理这种内存耗尽的意外状况,一些内存管理体系(比如C++ STL中的一级配置器等相关机制)会提供一种备用的处理方式,也就是通过 函数来尝试做进一步的应对操作。其核心作用在于当常规的内存分配途径(如直接调用 )失败时,给程序一个机会去采取其他补救措施,例如释原创 2024-12-25 09:58:00 · 510 阅读 · 0 评论 -
一级空间配置器和二级空间配置器区别
在C++ STL的内存管理体系中,一级配置器()和二级配置器(原创 2024-12-25 09:51:12 · 390 阅读 · 0 评论 -
vector调用clear和erase后会释放内存吗,capacity为何不变
clear很简单,直接调用erase 从头到尾遍历,逐个erase。跟到最后,发现erase最后调用的是一个析构函数。原创 2024-12-25 15:03:08 · 336 阅读 · 0 评论 -
STL heap原理和用法
在C++ STL(标准模板库)中,heap(堆)并不是一个独立的容器,而是一组基于容器(通常是vector,用于将一段数据组织成堆的数据结构形式,并提供了一些对堆进行操作的功能。原创 2024-12-25 21:53:40 · 1089 阅读 · 0 评论 -
C++ STL vector 清除内存
函数可以请求容器减少其容量以适应其当前的大小。不过需要注意的是,这只是一个请求,标准库并不保证一定会释放多余的内存,具体是否释放取决于标准库的实现。容器中的所有元素,它会将容器的大小变为0,但并不一定会立即释放所占用的内存空间给操作系统。在不同的应用场景和标准库实现下效果可能会有所差异。在其作用域结束后会自动析构并释放内存),而原。技巧相对更能确保内存被释放回操作系统,而。其原理是创建一个临时的空。所占用的内存就会被释放(因为临时的空。所占用的内存,可以通过。在C++的STL中,原创 2024-12-30 10:52:26 · 1227 阅读 · 0 评论
分享