总结STL中vector,set,multiset,map,multimap,deque,stack,list,queue,priority_queue,string的优缺点以及基本的函数用法。
STL存在的意义就是把c语言中数据结构的很多很多的代码封装成一个个函数名,方便调用,提高效率。
vector(数组)
优点:不用定义长度,可逆序,可快排,清空容器简单clear。
缺点:find不好用,时间复杂度高。erase不好用,删除元素麻烦。
特别的用法:查找一个字符串是否是另一个字符串的子串。如果是,返回值为0,如果不是,返回值为数字乱码。
deque(双端队列)
头部尾部都可以插入和删除元素,尾插会扩张队列,而头插和insert插入只会覆盖原有的元素(这个设定很奇怪,不明白有什么用。。。),deque在练习STL习题的时候没用过,如何需要用队列这个数据结构的话,我都是用queue,就不说deque的优缺点了,总之函数用法和vector很像。
stack(堆栈)
都是基本操作,没啥说的。。。
list(双向链表)
ps:先吐槽一下,目前我还不知道怎么用STL创建一个循环链表,百度了一波也没个结果,如果有大神会的,私信me呀。。。
优点 :可以用快排sort,删除函数remove好用,有一个特别的函数unique。
缺点:find搜索时间复杂度高,删除函数erase不好用。
queue(队列)
没什么好说的,就是一个数据结构,先进先出,即元素只能从队尾插入,队头删除。
priority_queue(优先队列)
优点:相较于queue,入队的元素会由大到小自动排列。这个结构很好用,构很好用,很好用,好用,用!
缺点:queue读取队头的函数是a.front(),而priority_queue读取队头的函数是a.top(),为什么要改呢?很容易记错的。。。而且和queue一样没有clear()清空函数,差评!
清空队列:
特别的:
和其他的不一样,这个<是按从小到大排列
set
结构体,需要内部重载排序:(set,multiset,map,multimap用法一样)
优点:采用中序遍历,检索快,find()时间复杂度低,自动升序排序,删除元素简单。
缺点:不能插入相同元素。有时候这个特性也是优点。
multiset
优点:相较于set,允许插入相同的元素,使用删除函数erase时,返回值为删除元素的个数。
缺点:使用find函数时,如果查找的元素有多个,只会返回第一个重复元素的迭代器位置。
map
函数用法和set一样,同样采用黑白树结构,唯一不用的只是键值后果跟了一个映照数据,这也是map的亮点呀!
优点:和set一样,find函数搜索极快,插入按照键值升序排列,删除元素简单,它的结构就是最大的优点。map的查找是对数时间的。对于2的32次方个元素,只需查找32次。由此可见map的高效。
缺点嘛目前用着没毛病。。。
multimap
允许插入重复的键值。
string(字符串)
string s1(s,i,len);这个定义很好用,s是一个字符串,s中下标i到i+len的字符赋值给s1。
s1.find(s2);在s1中查找s2,如果找到就返回所在的第一个下标,找不到就返回很大的一个数,时间复杂度是很高的,比KMP慢很多。
string s1(a.rbegin(),a.rend());这个操作可以把a逆序赋值给s1。
总结:
如果你需要一个搜索快的结构,当然是选择黑白树啦,即可以用map,multimap,set,multiset,而其他的采用线性结构,搜索时间复杂度就很高。如果你需要一个插入就排好序的结构,优先队列priority_queue是首选,其次是map,multimap,set,multiset,如果你需要删除方便的结构,当然还是选map,multimap,set,multiset。结构内含快排的有list和vector。目前很常用的就是map,priority_queue,set,queue,vector。结构内不含清空函数clear的:stack,queue,priority_queue。其实clear的底层实现是erase(map.begin(),map.end()).所以没有erase函数就没有clear函数喽。
不断更新中。。。未完待续