2024年C++标准模板库STL【最全总结】【收藏方便使用,腾讯大牛教你自己写C C++框架

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

vector Arrayname[arraysize];

//例如 vector vi[100];

访问方式


  • 下标访问

  • 迭代器访问

//第一种

vector::iterator it = vi.begin();

for(int i = 0; i < 5; i++){

printf("%d ",*(it + i));

}

//第二种

//vector的迭代器不支持it < vi.end()写法,因此循环条件只能用it != vi.end()

for(vector::iterator it = vi.begin(); it != vi.end(); it++){

printf("%d ", *it);

}

在常用 STL 容器中,只有在 vector 和 string 中,才允许使用 vi.begin()+3 这种迭代器加上整数的写法。

常用函数


push_back(x) 在 vector 后面添加一个元素x,时间复杂度为O(1)

pop_back() 删除尾元素,时间复杂度为O(1)

size() 获得 vector 中元素的个数,时间复杂度为O(1)

clear() 清空 vector 中所有的元素,时间复杂度为O(N)

insert(it,x) 用来向 vector 的任意迭代器 it 处插入一个元素 x,时间复杂度为 O(N)

erase(it) 删除迭代器为 it 处的元素

erase(first,last) 删除[first,last) 左闭右开 内的所有元素

常见用途


  • vector翻译为向量,在这里称为“变长数组”更贴切些,在考试题中,往往会遇到只用普通数组会超内存的情况,这时使用vector会让问题解决便捷许多。另外,vector 还可以使用邻接表的方式储存图。

  • vector 本身可以作为数组使用,而且在一些元素个数不确定的场合可以很好的节省空间。

  • 有些场合需要根据一些条件把部分数据输出在同一行,数据中间用空格隔开。由于输出数据的个数是不确定的,为了更方便地输出最后一个满足条件的数据后面不输出额外的空格,可以先用 vector 记录所有需要输出的数据,然后一次性输出。

set

======================================================================

  • set翻译为集合,是一个内部自动有序且不含重复元素的容器。在考试中,有可能出现需要去掉重复元素的情况,而且有可能因为这些元素比较大或者类型不是int型而不能直接开散列表,在这种情况下就可以使用set来保留元素本身而不考虑它的个数。而且加入set之后可以实现自动排序,因此熟练使用set可以在做某些题时减少思维量。

定义


引入

#include

其定义的写法其实和vector基本是一样的,或者说其实大部分STL都是这样定义的。这里的typename依然可以是任何基本类型,例如 int,double,char,结构体等,或者是STL标准容器,例如vector,set,queue等

set name;

set数组的定义和vector相同

set Arrayname[arraySize]; //每一个都是一个set容器

访问方式


set只能通过迭代器 iterator 访问

//由于除了 vector 和 string 之外的 STL 容器都不支持 *(it+i) 的访问方式,因此只能按照如下方式来枚举

for(set::iterator it = st.begin(); it != st.end(); it++){

printf(“%d”,*it);

}

常用函数


insert(x) 将x插入到set容器中,并且自动递增排序和去重,时间复杂度O(logN),N为set内的元素个数

find(value) 返回set中值为value的迭代器,时间复杂度O(logN),N为set内的元素个数

set st;

for(int i = 1;i<=3;i++){

st.insert(i);

}

set::iterator it = st.find(2); //在set中查找2,返回其迭代器

printf(“%d\n”,*it); //输出2

erase(it) 删除迭代器为it的元素,时间复杂度为O(1),可以结合find()函数来使用

set st;

for(int i = 1;i<=3;i++){

st.insert(i);

}

st.erase(st.find(1)); //利用find函数找到1,然后用erase函数删除它

erase(first,last) 删除一个区间内的所有元素,同vector一样,也是左闭右开

size() 获取set内元素的个数,时间复杂度为O(1)

clear() 用来清空set中的所有元素,复杂度为O(N),其中N为set内元素的个数

常见用途


  • set翻译为集合,是一个内部自动有序且不含重复元素的容器。在考试中,有可能出现需要去掉重复元素的情况,而且有可能因为这些元素比较大或者类型不是int型而不能直接开散列表,在这种情况下就可以使用set来保留元素本身而不考虑它的个数。而且加入set之后可以实现自动排序,因此熟练使用set可以在做某些题时减少思维量。

  • set主要用途是自动去重并按照升序排序,因此碰到需要去重但是却不方便直接开数组的情况,可以尝试用set解决。

  • set中元素是唯一的,如果需要处理不唯一的情况,则需要使用multiset

string

=========================================================================

定义


引入

#include

定义

string str = “123”;

访问方式


  • 通过下标访问,如果是读入或者是输出整个字符串,只能用cin或者是cout,如果非要用printf输出整个字符串,可以使用c_str()将string类型转为字符数组进行输出。

  • 通过迭代器访问

for(string::iterator it = str.begin();it!=str.end();it++){

printf(“%c”,*it);

}

常用函数


operator± 直接使用+将两个字符串直接拼接起来

compare operator 直接使用 == ,!=,<,<=,>,>=比较大小,比较规则是字典序

length()/size() length()返回字符串的长度,即存放的字符数,时间复杂度是O(1)。size()与length()基本相同

insert(pos,string) 在 pos 号位置插入字符串 string,时间复杂度为O(N)

insert(it,it2,it3) it2和it3为待插入字符串的首尾迭代器,用来表示串[it2,it3)将被插在it的位置上

erase(it) 删除迭代器为it的元素,时间复杂度为O(N)

erase(first,last) 删除一个区间内的所有元素,时间复杂度为O(N)

erase(pos,length) 其中pos为需要开始删除的起始位置,length为删除的字符个数

clear() 用于清空string中的数据,时间复杂度为O(1)

substr(pos,len) 返回从pos号位开始,长度为len的子串,时间复杂度为O(len)

string::npos 是一个常数,其本身的值为-1,但由于是unsigned_int类型,因此实际上也可以认为是unsigned_int类型的最大值。string::npos 用以作为find函数失配时的返回值,所以可以认为string::npos可以等于-1或者4294967295

str.find(str2) 当str2是str的子串时,返回其在str中第一次出现的位置,如果str2不是str的子串,那么返回string::npos

str.find(str2,pos) 从str的pos号位开始匹配str2,返回值与上相同,时间复杂度为O(nm),其中n和m分别为str和str2的长度。

str.replace(pos,len,str2) 把str从pos号位开始,长度为len的子串替换为str2

str.replace(it1,it2,str2) 把str的迭代器[it1,it2]范围的子串替换为str2 时间复杂度为O(str.length())

map

======================================================================

  • map翻译为映射,也是常用的STL容器。在定义数组时,如a[2] = 3其实是定义了一个从int到int的映射,b[2]=3.5定义了int到double的映射,无论是什么类型,总是将int类型映射到了其他类型。当需要以其他类型作为关键字来做映射时,会显得不方便。我们可以利用map实现将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器)。

定义


引入

#include

单独定义一个map

map<type1,type2> mp;

如果是字符串到整型的映射,必须使用string而不能使用char数组

map<string,int> map;

将一个set容器映射到一个字符串

map<set,string>

访问方式


  • 通过下标访问

对于一个定义为map<char,int> mp的map来说,就可以直接使用mp[‘c’]的方式来访问它对应的整数。

  • 通过迭代器访问,map可以使用it->first来访问键,使用it->second来访问值

map<char,int> mp;

mp[‘m’] = 20;

mp[‘r’] = 30;

mp[‘a’] = 40;

for(map<char,int>::iterator it = mp.begin();it!=mp.end();it++){

printf(“%c %d”,it->first,it->second);

}

常用函数


find(key) 返回键为key的映射的迭代器,时间复杂度为O(log N),N为map中的映射的个数

map<char,int> mp;

mp[‘m’] = 20;

mp[‘r’] = 30;

mp[‘a’] = 40;

map<char,int>::iterator it = mp.find(‘r’);

printf(“%c %d\n”,it->first,it->second);

erase(it) 删除单个迭代器,可以配合find函数使用

map<char,int> mp;

mp[‘m’] = 20;

mp[‘r’] = 30;

mp[‘a’] = 40;

map<char,int>::iterator it = mp.find(‘b’);

mp.erase(it);

erase(key) key为欲删除的键,时间复杂度为O(logN)

erase(first,last) 删除一个区间内的所有元素

map<char,int> mp;

mp[‘m’] = 20;

mp[‘r’] = 30;

mp[‘a’] = 40;

map<char,int>::iterator it = mp.find(‘m’);

mp.erase(it,mp.end());

size() 用来获得map中映射的对数,时间复杂度为O(1)

clear() 用来清空map中所有的元素,时间复杂度为O(N),N为元素个数

常见用途


  • 需要建立字符与整数之间映射的题目,使用map可以减少代码量

  • 判断大整数或者其他类型是否存在的题目,可以把map当bool数组用

  • 字符串和字符串的映射也有可能会用到

  • 注意,map的键和值是唯一的,而如果一个键需要对应多个值,就只能用multimap

queue

========================================================================

  • queue翻译成队列,先进先出的容器,尾进头出

定义


引入

#include

queue定义的写法和其他STL容器相同

queue name;

访问方式


由于队列本身是一种先进先出的限制性数据结构,因此在STL中只能通过front()来访问队首元素,或者通过back()来访问队尾元素

queue q;

for(int i = 1;i<=5;i++){

q.push(i);

}

printf(“%d %d\n”,q.front(),q.back());

常用函数


push(x) 将x进行入队,时间复杂度为O(1)

front(),back() 获得队首和队尾元素

pop() 令队首元素出队,时间复杂度为O(1)

empty() 检测queue是否为空,返回true则空,返回false则非空

size() 返回queue内元素的个数,时间复杂度为O(1)

常见用途


  • 当需要实现bfs时,可以不用自己动手实现一个队列,而是用STL中的queue作为代替,以提高程序的准确性

  • 有一点需要注意,使用front()和pop()函数前,必须用empty()判断队列是否为空,否则有可能因为队列空而出现错误。

priority_queue

==================================================================================

  • priority_queue又称为优先队列,其底层是用堆来实现的,在优先队列中,队首元素一定是当前队列中优先级最高的那一个。例如在如下的队列中有以下元素,且定义好了优先级

桃子(优先级3)

梨子(优先级4)

苹果(优先级1)

那么出队的顺序为梨子(4)->桃子(3)->苹果(1)

当然,可以在任何时候往优先队列里面push元素,而优先队列底层的数据结构heap会随时调整结构,使得每次的队首元素都是优先级最大的。

定义


引入

#include

定义

priority_queue name;

访问方式


和队列不一样的是,优先队列没有front()函数与back()函数,而只能通过top()函数来访问队首元素(也可以称为堆顶元素),也就是优先级最高的元素

priority_queue q;

q.push(3);

q.push(4);

q.push(1);

printf(“%d\n”,q.top());

常用函数


push(x) 将x入队,时间复杂度为O(logN),其中N为当前优先队列中的元素个数

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

定义

priority_queue name;

访问方式


和队列不一样的是,优先队列没有front()函数与back()函数,而只能通过top()函数来访问队首元素(也可以称为堆顶元素),也就是优先级最高的元素

priority_queue q;

q.push(3);

q.push(4);

q.push(1);

printf(“%d\n”,q.top());

常用函数


push(x) 将x入队,时间复杂度为O(logN),其中N为当前优先队列中的元素个数

[外链图片转存中…(img-u9QWbEah-1715569418970)]
[外链图片转存中…(img-4zIhrHNU-1715569418970)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值