C++ STL中的变易算法(Modifying Algorithms)是指那些能够修改容器内容的算法,主要用于修改容器中的数据,例如插入、删除、替换等操作。...Swap 算法函数,用于交换两个对象或是两个结构的值。...在C++11中,类也可以自定义swap成员函数,当使用了自定义的swap函数时,调用std::swap函数将使用类内定义的swap函数进行值交换。...一般而言,自定义swap函数应该优先使用std::swap进行值交换,从而可以借助std::swap的优势提高交换效率。...std::uniform_real_distribution:用于生成随机的浮点数分布,可以指定实数范围。std::normal_distribution:用于生成随机的标准正态分布或自定义正态分布。
C++ STL中的变易算法(Modifying Algorithms)是指那些能够修改容器内容的算法,主要用于修改容器中的数据,例如插入、删除、替换等操作。...Swap 算法函数,用于交换两个对象或是两个结构的值。...在C++11中,类也可以自定义swap成员函数,当使用了自定义的swap函数时,调用std::swap函数将使用类内定义的swap函数进行值交换。...一般而言,自定义swap函数应该优先使用std::swap进行值交换,从而可以借助std::swap的优势提高交换效率。...std::normal_distribution:用于生成随机的标准正态分布或自定义正态分布。
迭代器最大的好处是实现了遍历逻辑与数据结构解耦,比如说,你使用迭代器实现了某个容器对象的遍历,后来发现这个容器不合适,需要更换成另外一个容器,那么在修改容器类型之后,就不用修改遍历操作。...C++中std的迭代器实现还是挺绕的,比如正向迭代器begin是第一个元素,end最后一个元素的后一个元素;反向迭代器rbegin是最后一个元素,rend是第一个元素的前一个元素——两者最好不要混用,用正向迭代器实现反向遍历操作多半不靠谱...{10, 20, 30, 40, 50}; std::cout 容器内容: "; for (const auto& elem : vec) { std::cout std::endl; std::cout std::endl; } 运行的结果是: 容器内容: 10 20 30 40 50 === 测试 1: fwd_it 指向第一个元素...不过在使用这个公式之前需要检查fwd_it是不是end,因为end是容器最后一个元素的后一个元素,对其进行加1操作可能会导致未定义的行为而出错。
最近在分析算子的火焰图数据,发现了比较多的std::vector::push_back操作,想着这里是否也可以优化一把。 截屏2021-12-26 下午9.15.04.png 必须了解几个事实。...vector的容量(内存)永远不会减少,即使调用 clear 方法,除非使用swap 方法。(C++11 语言提供了shrink_to_fit方法修复。)...push_back除了把数据push进容器,还会对容器内存size大小做边界检查。如果容器没有空间储存新的元素,还会对容器内存进行一次扩容。...我门都知道扩容是容器去系统找一份更大的内存地址,然后把元素拷贝过去。所以这里经常会用reserver去预分配内存,避免扩容操作。而操作符operator[]只是做一些地址寻找,然后在地址上填充数据。...这里stackoverflow线程还讨论更多的扩展点,一个比较有意思的地方就是相比于单纯的new之后执行operator[],额外进行一次memset竟然会减少之后的处理时间。
//5.1: std::swap(_con[child], _con[parent]); //注意4:Swap(&a[child], &a[parent]); ---> std::swap(_con[child...]); ---> std::swap(_con[minchild], _con[parent]); 在代码中使用 std::swap(_con[child], _con[parent]) 替换原始的...一、原始代码的问题(注释中的旧版本) a 是外部传入的数组指针(如:HPSortType* a),需要通过 &a[child] 获取元素地址,再传递给自定义的 Swap 函数进行交换。...二、修改后使用 std::swap 的原因(当前版本) 自定义的 priority_queue 类模板中,元素存储在成员变量 _con(底层容器,如:vector)中。...自定义算法逻辑 在自定义算法中,通过仿函数将逻辑抽象出来,提高代码复用性。
一、queue的介绍和使用 1、queue的介绍 queue详解 队列是一种容器适配器,专门用在先进先出操作中,从容器一端插入元素,另一端提取元素 队列作为容器适配器实现,就是将特定容器封装成其底层容器类...,容器适配器在需要时自动调整结构 2、priority_queue的使用 优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue...中放自定义类型的数据,用户需要在自定义类型中自己重载符号,就比如说日期类就要重载>、的方式进行比较 手感火热做道题 数组中的第K个最大元素 class Solution { public...主要的就是向上调整算法和向下调整算法,与之前C语言学过的一样,稍有改变 三、仿函数 1、仿函数的特征 优先级队列中的less和greater叫做仿函数 重载圆括号运算符:仿函数的核心在于它重载了圆括号...2、仿函数的使用 仿函数实际上就是重载括号,使用起来跟函数指针类似,它不仅能够像函数一样被调用,又具有类和对象的特性,像我们之前如果写向上调整算法以及向下调整算法,大堆和小堆是需要到算法中修改代码的,
字符串翻转 - std::reverse 函数 1、std::reverse 函数原型说明 2、代码示例 - std::reverse 函数 一、string 字符串转换 - std::transform...函数 1、std::transform 函数原型说明 C++ 的 std::transform 函数是 头文件中的一个通用算法 , 用于对指定范围内的元素进行转换 ; std...命令空间 中的 transform 函数 用于对 STL 容器 指定范围的内容进行转换 ; 根据提供的参数 , 该函数可以从源字符串中提取字符 , 并按照指定的格式进行转换 , 然后返回一个新的字符串...二、string 字符串翻转 - std::reverse 函数 1、std::reverse 函数原型说明 std::reverse 是 头文件中 的一个 算法函数 , 用于反转给定...STL 容器 范围内的元素的顺序 ; std::reverse 函数原型 : template void reverse( BidirectionalIt
容器适配器通过在需要时自动调用算法函数make_heap、push_heap和pop_heap来自动完成此操作 函数使用 优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将...默认是 std::vector,但也可以是其他符合要求的容器类型,比如 std::deque。...(std::sort, std::for_each 等)中作为比较函数或者操作函数,以及在容器(如 std::set 或者 std::map)中作为排序准则 这是如何在 std::sort 算法中使用仿函数的一个实例...在C++11及之后的版本中,由于引入了泛型 lambda 表达式,直接传递 lambda 函数给标准算法(如 std::sort),使得使用 std::greater 和 std::less 变得不那么必要了...如果在priority_queue中放自定义类型的数据,用户需要在自定义类型中提供> 或者的重载 class Date { public: Date(int year = 1900, int month
今天,我们将深入探讨std::unique_ptr的灵魂组件——自定义删除器,并揭示其如何将RAII模式泛化到任何一种资源,以及其背后深刻的类型系统哲学。...,可以放在同一容器中std::unique_ptr>ptr2(newint(100));std::vectorstd::unique_ptr的类型污染了unique_ptr的类型。两个仅删除器类型不同的unique_ptr是不同类型,不能互相赋值,也不能放入同一容器(除非使用类型擦除)。...,"r"),FileCloser);std::shared_ptrsocketResource(CreateSocket(),SocketCloser);//它们可以被放入同一个容器std:...结语当我们超越std::unique_ptr的表面,深入探究其自定义删除器机制时,我们看到的不仅仅是一个方便的工具,而是一套完整的、可扩展的资源管理范式。
priority_queue是C++标准库中的一个容器适配器,用于实现优先队列(priority queue)的数据结构。...typename Container = std::vector:底层容器类型,默认为std::vector。...虽然std::deque也满足条件,但std::vector因其高效的随机访问性能而更常被用作底层容器。...以下是这些接口的使用: //使用示例 #include #include using namespace std; //这是自定义优先级的一种格式 template<typename...father=0 child=father*2+1(这里father和child的计算公式是可以互推的) 向下调整的方法我在以下文章中有具体讲解: 堆(建堆算法,堆排序)_初始建堆算法-CSDN博客 四
仿函数的用途 算法参数化:仿函数可以作为算法的参数,使得算法可以根据传入的不同仿函数表现出不同的行为。...Container: 这是一个可选的模板参数,用来指定底层容器的类型。默认情况下,std::priority_queue 使用 std::vector 作为其底层容器。...但是,可以选择任何支持随机访问迭代器的容器类型,例如 std::deque。请注意,底层容器必须支持 push_back 和 pop_back 操作。...使用 优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成 堆 的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用...,用户需要在自定义类型中提供> 或者的重载。
(q) 交换当前优先级队列与q中的元素 std::less 默认仿函数,构建最大堆 std::greater 自定义仿函数,构建最小堆(需自定义仿函数参数) 传入自定义类型的注意事项 当你使用...如果你要将自定义类型的对象放入 std::priority_queue 中,并且希望使用不同于默认的优先级规则(例如,你可能希望较大的元素具有较高的优先级),你需要提供一个自定义的比较函数。...当使用自定义类型时,传入std::greater或std::less会自动调用自定义类型重载的来构建优先级队列。...仿函数的使用使得priority_queue能够支持多种排列规则,而不需要修改底层容器的实现。 仿函数的使用场景 排序:在STL算法(如std::sort)中,可以使用仿函数自定义排序准则。...筛选:在STL算法(如std::remove_if)中,可以使用仿函数定义筛选条件。 优先级队列:在std::priority_queue中,仿函数用于定义元素的优先级排序。
以下堆的调整算法均以大堆为例 1....堆的向上调整算法 大堆为例,堆的向上调整算法就是在大堆的末尾插入一个数据后,经过一系列的调整,使其仍然是一个大堆。...堆的向下调整算法 以大堆为例,使用堆的向下调整算法有一个前提,就是待向下调整的结点的左子树和右子树必须都为大堆。 主要思路: 将目标结点与其较大的子结点进行比较。...} 4. push 因为我们不知道这里的储存数据类型是自定义类型还是内置类型,所以我们采用引用传参(避免自定义类型传参引发的消耗太大),并且我们不对插入的数据进行修改,所以加一个const修改;push...它不仅是一个“用起来方便”的容器,更是许多算法(如 Dijkstra、Prim、Huffman 编码等)的核心工具。理解其本质,有助于我们在面对复杂问题时灵活选择合适的数据结构。
底层容器可以是任意标准容器类模版,也可以是其他特定设计的容器类。...容器应该可以随机访问迭代器访问,并支持以下的操作: empty():检测容器是否为空 size():返回容器中有效元素个数 front():返回容器中第一个元素的引用 push_back():在容器尾部插入元素...需要支持随机访问迭代器 ,以便始终在内部保持堆结构,容器适配器通过在需要时自动调用算法函数make_heap,push_heap,和pop_heap来完成自动操作 priority_queue的使用 优先级队列默认使用...vector作为其底层容器存储数据的容器,在vector上又使用堆算法讲vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的成员位置,都可以考虑使用priority_queue...如果在priority_queue中放自定义类型的数据,用户需要在自定义类型中提供> 或者的重载。
正文 nlohmann/json是一个C++的读写JSON的组件,号称使用现代C++范式写的。简单看了一下,这个组件确实包含了很多cpp11以上的特性,在vs2015及一下的版本甚至没办法正常编译。...在使用过程中,遇到了一个问题是没办法保持插入的顺序,每个插入的键值对会按照字符串的顺序排列的,因为其内部用到了std:map。...)等容器专门化对象类型。...nlohmann::fifo_map同样在github上找到,“专门化对象类型”的意思是nlohmann/json组件内部用到了很多std容器,只需要将其替换成可以保存插入顺序的容器就可以了,也就是nlohmann...::cout std::endl; std::cout std::endl; return 0; } 运行结果如下所示
栈是一种先进后出(LIFO)的数据结构,类似于我们平时堆叠的一摞书,只能在顶部进行操作。在C++中,可以使用std::stack模板类来创建栈。...如下图所示: stack和queue都有自己的特点和适用场景。栈常用于实现递归算法、表达式求值和括号匹配等问题,而队列常用于实现广度优先搜索(BFS)算法、任务调度和缓冲区管理等问题。...,因为是使用STL标准库里的容器来实现,所以我们只需要调用标准库里给的构造函数即可,因为类的默认构造会自动调用自定义类型的默认构造,所以这里的默认构造可以不写,栈是使用标准库里的容器来存储数据的,所以不需要手动实现拷贝...,直接调用自定义类型的默认构造即可,队列是使用标准库里的容器来存储数据的,所以不需要手动实现拷贝 ✨queue实现代码 using namespace std; #include #...void swap(queue& q) { _c.swap(q.
读本文前假设已读过这篇文章 在 Python 中如何编写一个自定义的字典类?大家可能被告诉要使用collections.abc中的类作为基类而不是dict。...我们需要什么样的鸭子 Python 的类型系统和多态基于鸭子类型,只要这个对象有我需要的所有特性我就能使用它,不管它类型为何。那么针对自定义字典,都是鸭子,我们需要什么样的鸭子呢?...但核心数据结构是写死的,可自定义空间不大。与之相对,collections.abc.Mapping给了你很大自由度,它没有自带的__init__方法,数据是存在自身还是存在远端都全凭你决定。...而用dict,要写自定义逻辑就得小心,容易造出四不像。...Python 居然没有一个让json.dumps读取的魔法方法,方便自定义类支持 JSON 序列化。导致json.dumps的这一特性,只对dict的派生类生效。
# 本文可以从https://sourceware.org/ml/gdb/2008-02/msg00064/stl-views.gdb直接下载 # 有关gdb的高级使用,请浏览:http://blog.chinaunix.net.../uid-20682147-id-76425.html # # 使用方法: # 将以下内容追加到~/.gdbinit文件的尾部,然后再启动gdb,如果gdb已经启动,则可以source ~/.gdbinit...::vector -- via pvector command # std::list -- via plist command # std::map -- via pmap...command # std::multimap -- via pmap command # std::set -- via pset command # std...::multiset -- via pset command # std::deque -- via pdequeue command # std::stack -- via
3·vector增删查改: 如:push_back;pop_back;find(这时algorithm算法库内的函数,也是使用迭代器区间:找到了返回指向那个位置的迭代器,否则返回右区间);insert;...②这里一开始用的是string.h里的memcpy ,利用的是浅拷贝,如果让里面的类型是自定义(有资源申请已经释放的)发现浅拷贝这样会出问题,故后面改正。...如果是自定义类型:就是它的默认构造函数构造出的对象。...8·swap的实现: swap也为后面对于拷贝构造和赋值重载的现代版本使用奠定基础。 void swap(vector& v) { std::swap(_start, v...._start); std::swap(_finish, v._finish); std::swap(_end_of_storage, v.
前言 点击跳转到文章【C++/STL】stack/queue的使用及底层剖析&&双端队列&&容器适配器 前面我们已经学习了list容器的相关知识,本文主要介绍STL中另外两种重要的结构,stack和queue...优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue...使用算法库里的 less 和 greater 算法,需要包含头文件 二、仿函数 ✨1,什么是仿函数 仿函数也叫函数对象,是一个重载了 运算符operator() 的类或结构体...,可以使得类的对象像函数一样使用,通过重载函数调用运算符,仿函数可以实现自定义的操作行为。...,并且可以与STL算法等标准库函数配合使用,提高代码的可读性和可维护性。