网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
size() 获取set内元素的个数,时间复杂度为O(1)
clear() 用来清空set中的所有元素,复杂度为O(N),其中N为set内元素的个数
-
set翻译为集合,是一个内部自动有序且不含重复元素的容器。在考试中,有可能出现需要去掉重复元素的情况,而且有可能因为这些元素比较大或者类型不是int型而不能直接开散列表,在这种情况下就可以使用set来保留元素本身而不考虑它的个数。而且加入set之后可以实现自动排序,因此熟练使用set可以在做某些题时减少思维量。
-
set主要用途是自动去重并按照升序排序,因此碰到需要去重但是却不方便直接开数组的情况,可以尝试用set解决。
-
set中元素是唯一的,如果需要处理不唯一的情况,则需要使用multiset
=========================================================================
引入
#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翻译为映射,也是常用的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翻译成队列,先进先出的容器,尾进头出
引入
#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又称为优先队列,其底层是用堆来实现的,在优先队列中,队首元素一定是当前队列中优先级最高的那一个。例如在如下的队列中有以下元素,且定义好了优先级
桃子(优先级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为当前优先队列中的元素个数
top() 令队首元素出队,时间复杂度为O(logN),其中N为当前优先队列中的元素个数
empty() 检测优先队列是否为空,返回true则空,返回false则非空,时间复杂度为O(1)
size() 返回优先队列内的元素的个数,时间复杂度为O(1)
元素优先级如何设置
基本数据类型
对于int,double,char型等可以直接使用的数据类型,
优先队列对他们的优先级设置一般是数字越大的优先级别越高,
char的话就是字典序越大的优先级越高。
自定义优先级
priority_queue<int,vector,less > q 数字越大的优先级越高,与默认效果一样
priority_queue<int,vector,greater > q 数字越小的优先级越高
结构体优先级的设置
优先队列的这个函数与sort中的cmp函数的效果是相反的
-
优先队列可以解决一些贪心问题,也可以对迪杰斯特拉算法进行优化,因为优先队列的本质是堆
-
在使用top函数时,必须用empty函数判断优先队列是否为空,否则可能会因为队空而出现错误
========================================================================
- stack是栈,是一个后进先出的容器
引入
#include
定义
stack< type > name;
stack只能通过top()来访问栈顶元素
push(x) 将x入栈,时间复杂度为O(1)
top() 获得栈顶元素,时间复杂度为O(1)
pop() 用来弹出栈顶元素,时间复杂度为O(1)
empty() 用来检测stack内是否为空,返回 true 为空, false 为非空,时间复杂度为O(1)
size() 返回stack 内元素的个数,时间复杂度为O(1)
- stack用来模拟实现一些递归,防止程序对栈内存的限制而导致程序运行错误。一般来说,程序的栈内存空间很小,对于有些题目来说,如果用普通的函数来执行递归,一旦递归层数过深,则会导致程序运行崩溃,如果用栈来模拟递归算法的实现,则可以避免这一方面的问题。
=======================================================================
- pair是一个很实用的“小玩意”,当想要将两个元素绑在一起作为一个合成元素、又不想要因此定义结构体时,使用pair可以很方便的作为一个代替品。也就是说,pair实际上可以看作一个内部有两个元素的结构体,而且这两个元素的类型是可以指定的。
struct pair{
type1 first;
type2 second;
};
引入
#include
或
#include
定义
pair <int,string> p;
//定义时初始化
pair <string,int> p(“test”,5);
//临时构建
pair <string,int>(“test”,5)
//使用自带的make_pair函数
make_pair(“test”,5)
使用first second的方式访问
pair<string,int> p;
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
引入
#include
或
#include
定义
pair <int,string> p;
//定义时初始化
pair <string,int> p(“test”,5);
//临时构建
pair <string,int>(“test”,5)
//使用自带的make_pair函数
make_pair(“test”,5)
使用first second的方式访问
pair<string,int> p;
[外链图片转存中…(img-hevOpfTV-1715569382780)]
[外链图片转存中…(img-5a91pGP1-1715569382780)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!