STL
文章平均质量分 59
发如雪-ty
一个工作7年的程序员,一直从事C++开发方面的工作,曾有幸在安防行业深耕4年,并有幸在工业检测行业工作至今已有3年,主要负责系统软件的设计与开发,个人编程的信仰:不要盲目学习酷炫的东西,最重要的依然是内功。
展开
-
多线程安全的Queue
多线程安全的队列原创 2023-10-05 16:37:51 · 189 阅读 · 0 评论 -
stl string内存空间增长探索
string 内存空间增长探索原创 2023-09-28 15:07:16 · 138 阅读 · 0 评论 -
std::back_inserter()的使用
有如下代码段:int main(){ vector<int> v1{ 1, 2, 3, 4, 5 }; vector<int> v2; copy(v1.begin(), v1.end(), v2.begin()); system("pause"); return 0;}结果:使用std::back_inserter()改进int main(){ vector<int> v1{ 1, 2, 3, 4, 5 }; vector<原创 2022-05-06 22:37:08 · 1333 阅读 · 0 评论 -
请为移动构造函数加上noexcept关键字
当 push_back、insert、reserve、resize 等函数导致内存重分配时,或当 insert、erase 导致元素位置移动时,vector 会试图把元素“移动”到新的内存区域。vector 通常保证强异常安全性,如果元素类型没有提供一个保证不抛异常的移动构造函数,vector 通常会使用拷贝构造函数。因此,对于拷贝代价较高的自定义元素类型,我们应当定义移动构造函数,并标其为 noexcept,或只在容器中放置对象的智能指针。下面看个例子:#include <iostream>原创 2022-05-05 23:57:51 · 721 阅读 · 0 评论 -
stl vector如何清理多余的空间
vector中reserve()接口是用来提前给vector对象分配空间的,这样再往里面增加元素的时候,会大大提高添加元素的效率,尤其对象,因为避免了因扩容而造成的复制操作。结果:原创 2022-04-23 20:35:46 · 176 阅读 · 0 评论 -
stl accumulate
stl中accumulate可以用于求和,如下:包含:#include <numeric>1.函数原型:accumulate(_InIt _First, _InIt _Last, _Ty _Val)2.普通类型:void main(){ std::vector < int > v{10, 20, 30, 40, 50, 60, 70, 1, 2}; int nsum = std::accumulate(v.begin(), v.end(), 0); cout &l原创 2021-12-29 21:39:19 · 918 阅读 · 0 评论 -
c++基础使用STL的注意的一些点
原创 2021-12-27 23:58:47 · 275 阅读 · 0 评论 -
C++基础函数适配器之mem_fun,mem_fun_ref
class person{public: person(string na, int age) { name = na; nage = age; } void show() { cout << name.c_str() << " " << nage << endl; }private: string name; int nage;};void main(){ cout << "mem_fun_ref测试原创 2021-12-27 23:40:29 · 756 阅读 · 0 评论 -
stl算法之merge
有些场景中,我们需要将 2 个有序序列合并为 1 个有序序列,这时就可以借助 merge() 或者 inplace_merge() 函数实现。值得一提的是,merge() 和 inplace_merge() 函数都定义在头文件中,因此在使用它们之前,程序中必须提前引入该头文件:#include <algorithm>merge() 函数用于将 2 个有序序列合并为 1 个有序序列,前提是这 2 个有序序列的排序规则相同(要么都是升序,要么都是降序)。并且最终借助该函数获得的新有序序列,其原创 2021-02-24 21:31:47 · 905 阅读 · 0 评论 -
stl算法之sort 02
对于“排序”这个计算机科学里的经典问题,你是绝对没有必要自己写 for 循环的,必须坚决地选择标准算法。在求职面试的时候,你也许手写过不少排序算法吧,像选择排序、插入排序、冒泡排序,等等,但标准库里的算法绝对要比你所能写出的任何实现都要好。说到排序,你脑海里跳出的第一个词可能就是 sort(),它是经典的快排算法,通常用它准没错。使用方法可以参考我的另一篇文章stl算法之sort 01不过,排序也有多种不同的应用场景,sort() 虽然快,但它是不稳定的,而且是全排所有元素。很多时候,这样做的成本比较原创 2021-02-24 11:10:21 · 225 阅读 · 0 评论 -
stl算法之sort 01
list和forward_list有成员sort()函数set/map自动排序array,vector,deque用全局sort()代码示例:void main(){ list<int> m_list{ 1, 3, 5, 7, 9, 2, 4, 6, 8, 10 }; cout << "m_list从大到小:"; m_list.sort([](int x, int y){return x > y; });//从大到小 for (auto node :m_li原创 2021-02-23 16:50:54 · 130 阅读 · 0 评论 -
C++ Count,Count_if,find,find_if
Count,Count_if,find,find_ifcout,count_if#include<list>#include<algorithm>using namespace std;void main(){ using _STL_STRING_LIST_ = list < string > ; _STL_STRING_LIST_ m_lis...原创 2020-01-01 17:06:51 · 656 阅读 · 0 评论 -
stl算法之replace,replace_if,replace_copy,replace_copy_if
1.replace自己实现源码template<typename iteratorty,typename type>void replace_ty(iteratorty first, iteratorty last, const type & oldvalue, const type & newvalue){ for (; first != last;first++) { if (*first == oldvalue) { //将所有等于oldvalue原创 2021-02-23 16:08:35 · 249 阅读 · 0 评论 -
stl算法之自己实现foreach函数
template<typename T,typename function>void for_each_ty(T first, T last, function f){ for (; first != last;first++) { f(*first); }}void main(){ std::vector<int> m_vc{ 1, 2, 3, 4, 5, 6 }; for_each_ty(m_vc.begin(), m_vc.end(), [](int原创 2021-02-23 14:14:48 · 140 阅读 · 0 评论 -
stl算法之accumulate
首先包含#include<numeric>然后看看代码:1.先看看累加void main(){ //1.默认累加 std::vector<int> a(100000, 1); a[2] = 2; a[3] = 2; a[4] = 3; clock_t t1 = clock(); int nsum = accumulate(begin(a), end(a), 0);//0 +1+2+3+4+5+6+7+0+0+0+0... clock_t t2 =原创 2021-02-23 11:34:14 · 173 阅读 · 0 评论 -
STL-12-unordermap和map的不同
需要引入的头文件不同map: #include < map >unordered_map: #include < unordered_map >内部实现机理不同 map: map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对原创 2021-02-03 20:57:08 · 590 阅读 · 0 评论 -
STL-11-set
1.关于set首先,set是关联容器,set作为一个容器是用来存储同一种数据类型的数据结构,基本功能与数组相似。不同的是,在set中每个元素的值都是唯一的。而且系统能够根据元素的值自动进行排序。但是set中数元素的值并不能直接被改变。除了set,STL中还有一些标准关联容器multiset、map和multimap等,这些关联容器内部均是采用红黑树实现的。set具有以下特性:(1)map和set的插入删除效率比其他序列容器高,这是因为:set中所有元素都是以节点的方式来存储的,其节点结构和链表类似原创 2021-02-02 22:29:23 · 161 阅读 · 0 评论 -
STL-10-map
map的使用map1、map简介2、map的功能3、使用map4、map的构造函数5、数据的插入和遍历6、map的查找7、从map中删除元素8、排序-map中的sort问题9、map的基本操作函数:map map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,原创 2021-02-01 23:36:42 · 228 阅读 · 0 评论 -
STL-09-forwardlist
forward_list 是 C++ 11 新添加的一类容器,其底层实现和 list 容器一样,采用的也是链表结构,只不过 forward_list 使用的是单链表,而 list 使用的是双向链表(如图 1 所示)。 通过图 1 不难看出,使用链表存储数据最大的特点在于,其并不会将数据进行集中存储(向数组那样),换句话说,链表中数据的存储位置是分散的、随机的,整个链表中数据的线性关系通过指针来维持。 原创 2021-01-31 17:32:59 · 208 阅读 · 0 评论 -
STL-08-priority_queue源码剖析
priority_queue一、相关定义二、使用方法1、普通方法:2、自定义优先级:3、结构体声明方式:4、代码使用介绍三、源码剖析一、相关定义 优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。这点类似于给队列里的元素进行了由大到小的顺序排序。元素的比较规则默认按元素值由大到小排序,可以重载“<”操作符来重新定义比较规原创 2021-01-31 15:18:36 · 279 阅读 · 0 评论 -
STL-07-queue、stack源码剖析
1.queue先进先出2.stack先进后出从上面源码可以看出实际上它们两者的底层就是使用deque;可以参考我的这篇文章dequeue源码剖析所以queue和stack可以说是容器适配器看看queue支持的函数员函数功能empty()如果 queue 中没有元素的话,返回 true。size()返回 queue 中元素的个数。front()返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,原创 2021-01-12 22:26:31 · 134 阅读 · 0 评论 -
STL-06-deque源码剖析
参考侯捷《STL源码剖析》deque概述vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。所谓双向开口,意思是可以在头尾两端分别做元素的安插和删除动作。vector当然也可以在头尾两端做动作,但是其头部动作效率奇差,无法被接受。deque和vector的最大差异,一在于deque允许在常数时间内对头尾端进行元素的安插或移除动作。二在于deque没有所有容量概念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。虽然deque也提供Ramdon A原创 2021-01-10 23:02:04 · 238 阅读 · 0 评论 -
STL-05-vector使用及其源码剖析
vector 容器是 STL 中最常用的容器之一,它和 array 容器非常类似,都可以看做是对 C++ 普通数组的“升级版”。不同之处在于,array 实现的是静态数组(容量固定的数组),而 vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整所占用的内存空间,整个过程无需人工干预。vector 容器以类模板 vector( T 表示存储元素的类型)的形式定义在 头文件中,并位于 std 命名空间中。因此,在创建该容器之前,代码中需包含如下内容:#in原创 2021-01-03 23:58:57 · 220 阅读 · 0 评论 -
STL-04-萃取技术
萃取原创 2021-01-03 15:26:17 · 489 阅读 · 1 评论 -
STL-03-list使用及其源码剖析
看这篇文章前。我希望你能懂我这篇文章里面的所有内容:链表的各种操作并且你要会运算符重载。先看看它怎么使用吧,先把所有的成员函数贴出来。成员函数功能begin()返回指向容器中第一个元素的双向迭代器。end()返回指向容器中最后一个元素所在位置的下一个位置的双向迭代器。rbegin()返回指向最后一个元素的反向双向迭代器。rend()返回指向第一个元素所在位置前一个位置的反向双向迭代器。cbegin()和 begin() 功能相同,只不过在其基础上原创 2021-01-02 22:53:53 · 178 阅读 · 0 评论 -
STL-02-array使用及其源码剖析
array 容器是 C++ 11 标准中新增的序列容器,简单地理解,它就是在 C++ 普通数组的基础上,添加了一些成员函数和全局函数。之前我在思考,STL为什么要多出这个容器呢?直接用数组它不香吗??它不快吗?非要搞出这么个玩意。后来我想明白了,我觉得它就是想要使用STL里面的算法。先把它用起来吧。首先需要引用:#include <array>array也就是数组嘛,所以它和我们常用的数组一样比如:int a[10],它表示10个整型的元素;array 容器和数组一样,它的大小也是固原创 2021-01-01 22:55:14 · 583 阅读 · 0 评论 -
STL-01-STL六大部件关系
解释一下:STL(Standard Template Library),即标准模板库,是一个高效的C++程序库。Container(容器):各种基本数据结构,如链表、队列等Adapter(适配器) :Algorithm(算法) 各种基本算法如sort、search…等Iterator(迭代器) 连接containers和algorithms(桥梁)Function object(函数对象)Allocator(分配器):就是内存管理的工具。...原创 2021-01-01 21:24:56 · 265 阅读 · 2 评论