STL资料全.docx
- 文档编号:3818801
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:49
- 大小:38.82KB
STL资料全.docx
《STL资料全.docx》由会员分享,可在线阅读,更多相关《STL资料全.docx(49页珍藏版)》请在冰豆网上搜索。
STL资料全
STL参考资料
目录
STL介绍3
1、STL简介3
2、算法3
3、容器3
4、迭代器4
5、使用注意4
一、stack堆栈5
成员函数:
5
实例程序:
5
二、queue队列6
成员函数:
6
实例程序:
6
三、PriorityQueues优先队列7
成员函数:
7
实例程序:
7
四、Bitset位集合9
成员函数:
9
实例程序:
9
五、list列表11
成员函数:
11
实例程序:
12
六、vector向量13
成员函数:
13
实例程序:
14
七、map/multimap映射与多重映射15
map成员函数:
15
Map实例程序:
17
MultiMap实例程序:
18
八、set/multiset集合与多重集合19
成员函数:
19
Set实例程序:
20
MultiSet实例程序:
21
九、deque(DoubleEndedQueue)双端队列22
成员函数:
22
实例程序:
23
十、string字符串24
成员函数:
24
实例程序:
28
十一、常用算法调用29
1.for_each29
2.min_element/max_element29
3.copy/copy_n/copy_backward29
4.fill/fill_n29
5.remove/remove_if30
6.unique31
7.rotate32
8.random_shuffle32
9.partition/stable_partition33
10.sort/stable_sort33
11.partial_sort34
12.nth_element34
13.lower_bound/upper_bound//要求区间有序34
14.binary_search//要求有序区间35
15.merge/inplace_merge35
16.includes36
17.set_union,set_intersection,set_difference,set_symmetric_diffrece36
18.next_permutation/prev_permutation36
19.power37
20.heapoperations38
21.min/max/swap39
22.numeric_limits39
STL介绍
1、STL简介
STL(StandardTemplateLibrary,标准模板库)是惠普实验室开发的一系列软件的统称。
它是由AlexanderStepanov、MengLee和DavidRMusser在惠普实验室工作时所开发出来的。
现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。
STL的代码从广义上讲分为三类:
algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
在C++标准中,STL被组织为下面的13个头文件:
、
以下笔者就简单介绍一下STL各个部分的主要特点。
2、算法
大家都能取得的一个共识是函数库对数据类型的选择对其可重用性起着至关重要的作用。
举例来说,一个求方根的函数,在使用浮点数作为其参数类型的情况下的可重用性肯定比使用整型作为它的参数类性要高。
而C++通过模板的机制允许推迟对某些类型的选择,直到真正想使用模板或者说对模板进行特化的时候,STL就利用了这一点提供了相当多的有用算法。
它是在一个有效的框架中完成这些算法的——你可以将所有的类型划分为少数的几类,然后就可以在模版的参数中使用一种类型替换掉同一种类中的其他类型。
STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。
这样一来,只要我们熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能并大大地提升效率。
算法部分主要由头文件
3、容器
在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要。
经典的数据结构数量有限,但是我们常常重复着一些为了实现向量、链表等结构而编写的代码,这些代码都十分相似,只是为了适应不同数据的变化而在细节上有所出入。
STL容器就为我们提供了这样的方便,它允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模板类,STL容器对最常用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。
容器部分主要由头文件,
对于常用的一些容器和容器适配器(可以看作由其它容器实现的容器),可以通过下表总结一下它们和相应头文件的对应关系。
数据结构
描述
实现头文件
向量(vector)
连续存储的元素
列表(list)
由节点组成的双向链表,每个结点包含着一个元素
双队列(deque)
连续存储的指向不同元素的指针所组成的数组
集合(set)
由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序
多重集合
(multiset)
允许存在两个次序相等的元素的集合
栈(stack)
后进先出的值的排列
队列(queue)
先进先出的执的排列
优先队列
(priority_queue)
元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列
映射(map)
由{键,值}对组成的集合,以某种作用于键对上的谓词排列
多重映射
(multimap)
允许键对有相等的次序的映射
4、迭代器
下面要说的迭代器从作用上来说是最基本的部分,可是理解起来比前两者都要费力一些(至少笔者是这样)。
软件设计有一个基本原则,所有的问题都可以通过引进一个间接层来简化,这种简化在STL中就是用迭代器来完成的。
概括来说,迭代器在STL中用来将算法和容器联系起来,起着一种黏和剂的作用。
几乎STL提供的所有算法都是通过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。
迭代器部分主要由头文件
5、使用注意
STL的区间都是左闭右开的。
例如:
[start,end)表示从start开始到end之前一个位置。
一、stack堆栈
头文件:
#include
实例化:
stack<类型[,存储容器]>StackName
成员函数:
boolempty();
栈为空返回true否则返回false.
voidpop();
移除堆栈中最顶层元素。
voidpush(constTYPE&val);
将val值压栈,使其成为栈顶的第一个元素
size_typesize();
返当前堆栈中的元素数目
TYPE&top();
返回对栈顶元素的引用
实例程序:
#include
#include
#include
usingnamespacestd;
intmain()
{stack
s.push
(1);s.push
(2);s.push(3);
cout<<"Top:
"< cout<<"Size: "< s.pop(); cout<<"Size: "< if(s.empty())cout<<"Isempty"< elsecout<<"Isnotempty"< return0; } 二、queue队列 头文件: #include 实例化: queue<类型[,存储容器]>QueueName 成员函数: boolempty(); 队列为空返回true否则返回false. voidpop(); 删除队列的一个元素。 voidpush(constTYPE&val); 将val元素加入队列。 size_typesize(); 返当前队列中的元素数目 TYPE&back(); 返回一个引用,指向队列的最后一个元素。 TYPE&front(); 返回队列第一个元素的引用。 实例程序: #include #include #include usingnamespacestd; intmain() {queue s.push (1);s.push (2);s.push(3); cout<<"Size: "< cout<<"Front: "< cout<<"Back: "< cout< s.pop(); cout<<"Size: "< cout<<"Front: "< cout<<"Back: "< if(s.empty())cout<<"Isempty"< elsecout<<"Isnotempty"< return0; } 三、PriorityQueues优先队列 类似队列,但是在这个数据结构中的元素默认使用小于号(std: : less 可以使用其他的比较方式。 头文件: #include 实例化: priority_queue<类型[,存储容器,比较谓词]>PriorityQueueName 成员函数: boolempty(); 优先队列为空返回true否则返回false. voidpop(); 删除优先队列中的第一个元素。 voidpush(constTYPE&val); 添加一个元素到优先队列中,值为val。 size_typesize(); 返当前队列中的元素数目 TYPE&top(); 返回一个引用,指向最高优先级的元素。 默认的比较方式是使用小于号运算符(<)进行比较,如果是系统提供的能够使用小于号比较的元素类型就可以只写元素类型;如果想用系统提供的大于号进行比较,则还需要给出存储容器和比较谓词;如果使用自定义的struct/class,则需要重载小于号运算符。 举3例: priority_queue v priority_queue structnode {inti; booloperator<(constnode&a)const{return(i }; priority_queue 以上三个优先队列出队的元素分别是最小的整数、最大的浮点数、成员i最小的node。 实例程序: #include #include #include usingnamespacestd; #definepow2(a)((a)*(a)) #definedist2(x,y)(pow2(x)+pow2(y)) structcoord {intx,y; constbooloperator<(constcoord&b)const {return(dist2(x,y) }; structcmp {constbooloperator()(constcoord&a,constcoord&b) {return(dist2(a.x,a.y) }; intmain() {priority_queue coorda; a.x=3,a.y=2; s.push(a); a.x=1,a.y=2; s.push(a); a.x=2,a.y=2; s.push(a); cout<<"Size: "< cout<<"Top: "< s.pop(); cout<<"Size: "< cout<<"Top: "< if(s.empty())cout<<"Isempty"< elsecout<<"Isnotempty"< return0; } 四、Bitset位集合 顾名思义就是一种位集合的数据结构。 Bitsets使用许多二元操作符,比如逻辑和,或等。 头文件: #include 实例化: bitset bitset 成员函数: 构造函数: bitset(); bitset(unsignedlongval); 以无参的形式创建bitset,或把一个长无符号整数转为二进制插入到bitset中。 模板中提供的数字决定bitset有多长。 操作符 ! =,==,&=,^=,|=,~,<<=,>>=,[] 不等,相等,与,异或,或,非,左移,右移(和普通位运算一样),取某一位(像数组) boolany(); 如果有位被置1返回true,否则返回false size_typecount(); 返回被设置成1的位的个数。 bitset&flip(); bitset&flip(size_tpos); 反转bitset中所有的位 反转pos上的位(pos是unsignedlong) boolnone(); 如果没有位被置1返回true,否则false bitset&reset(); bitset&reset(size_tpos); 置零bitset中所有的位 置零pos上的位(pos是unsignedlong) bitset&set(); bitset&set(size_tpos,intval=1); 置1bitset中所有的位 置1pos上的位(pos是unsignedlong) booltest(size_tpos); 如果指定位为1返回true,否则false stringto_string(); 转换成string返回以便输出,可直接cout unsignedlongto_ulong(); 转换成unsignedlong返回. 操作符的使用: bitset : referencebitset : operator[](size_tidx) boolbitset : operator[](size_tidx)const 第一种形式返回的是对在idx位置的那个位的引用,所以可以把它当作左值进行修改。 第二种类型返回的是bool类型,输出前需要进行强制类型转换。 istream&operator>>(istream&strm,bitset 尽可能多地读入包含0,1的字符串,如果长度小于bitset的长度,使用前导0填充 实例程序: #include #include usingnamespacestd; intmain(){ bitset<64>bs; bs=1; cout< bs^=63; cout< bs>>=1; cout< cout<<~bs< cout<<"1Bits: "< cout< bs.set(32); cout< bs.flip(32); cout< return0; } 五、list列表 头文件: #include 实例化: list<类型>ListName 成员函数: 构造函数(使得可以在定义时赋初值) list(); list(size_typen,constTYPE&v) list(constlist&from) list(input_iteratorstart,input_iteratorend) ·无初值 ·给出n个初值 ·由另一个list初始化 ·由[start,end)区间内的值初始化 voidassign(input_iteratorstart,input_iteratorend); voidassign(size_typenum,constTYPE&val); ·清空链表,插入区间[start,end)的内容到list中 ·清空链表,插入num个值为val的元素 TYPE&back() 返回对最后一个元素的引用 TYPE&front() 返回对第一个元素的引用 iteratorbegin() 返回指向第一个元素的迭代器 iteratorend() 返回指向链表末尾(最后一个元素之后的那个位置)的迭代器 voidclear() 清空链表 boolempty() 如果链表为空返回true,否则返回false iteratorerase(iteratorpos); iteratorerase(iteratorstart,iteratorend); ·删除pos所指元素并返回下一元素迭代器 ·删除[start,end)之间的元素,并返回最后一个被删除元素的下个元素的迭代器 iteratorinsert(iteratorpos,constTYPE&val); voidinsert(iteratorpos,size_typenum,constTYPE&val); voidinsert(iteratorpos,input_iteratorstart,input_iteratorend); ·插入一个值为value的元素在pos位置并返回其迭代器,原pos及以后的元素后移。 ·插入num个值为value的元素在pos位置,原pos及以后元素后移。 ·插入[start,end)之间的元素到pos位置,原pos及以后元素后移 voidmerge(list&lst); voidmerge(list&lst,boolCmpfunc) //boolCmpfunc(Type&a,Type&b) 将链表lst有序地合并到原链表中,默认使用小于号进行比较插入,可指定比较函数Cmpfunc,对两个TYPE类型元素进行比较 voidpop_back(); 删除链表的最后一个元素。 voidpop_front(); 删除链表的第一个元素。 voidpush_back(constTYPE&val); 将val连接到链表的最后。 voidpush_front(constTYPE&val); 将val连接到链表的头部。 voidremove(constTYPE&val); 删除链表中所有值为val的元素。 voidremove_if(booltestfunc) //booltestfunc(TYPE&val) 用testfunc一元函数来判断是否删除元素 如果testfunc返回true则删除该元素。 size_typesize() 返回list中元
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STL 资料
![提示](https://static.bdocx.com/images/bang_tan.gif)