概述STL
使用stl可以大大提高算法设计的效率和可靠性。
- 概述:
STL 即Standard Template Library标准模板类库。
是标准c++库的子集
通用,强大
- 构成:
container:容器(储存元素)
algorithm:算法(操作元素)
iterator:迭代器(类似指针)
容器container:是一种数据结构
顺序容器:
1)
2)
string 类似于上面的函数,有个别的例外。
3)
Dequen双端队列容器
是链表和字符串的调和产物,是多个连续的队列块。
4)list链表容器
是一个双链表类模板,只能使用++ - -来使用迭代器
2. 关联容器:
关联容器中每个元素都有一个关键字(key),通过key来储存和读取原损失,这些关键词可能于元素在容器中的位置无关,所以关联容器中不提供顺序容器中的front(),push_front(),pop_back()等操作,可以实现快速搜索(运用了分类的数据结构)
1)set(集合容器)/multiset(多重集合容器)
区别:
set中元素的关键字是唯一的,而multiset的关键字可以不唯一。默认情况下会对元素按照升序排列。
而如果需要集合中的元素可以重复那么可以使用multiset。
又由于set没有重复的元素,所以如果添加的元素相同,那么不添加;而multiset可以有重复的元素,所以在删除的时候,会将其全部删除然后返回一个被删去元素个数。
特殊的函数有:
count(k)返回k在set中的次数。
find(k)如存在返回该元素的迭代器,否则返回end();
upper/lower_bound(k)返回关键字>k或>=k的第一个元素的迭代器
2)map(映射容器)/multimap(多重映射容器)
映射是实现关键字和值的各系的储存结构,可以用key来访问value
实现关键字和值关系的对应,而map是一一对应;而multimap是
同时map/multimap容器中的key和value是pair类型(不是像set一样两者都是key类型)pair是一个结构体声明如下:
struct pair
{ T first;//对应key值
T second;//对应value值
}
按照key升序排列,以红黑树的形式。map支持【】;而multimap不允许【】(在使用map[key]的时侯如果不存在该key值那么就以其为关键字插入一个元素。
三种方式插入:
#include<bits/stdc++.h>
using namespace std;
int main(){
map<char,int> mym;
mym['a'] = 1;
mym.insert(pair<char,int>('b',2));
mym.insert(map<char,int>::value_type('c',2));
map<char,int>::iterator it;
for(it = mym.begin();it!=mym.end();++it){
cout<<it->first<<it->second;
}
return 0;
}
适配器容器:
是基于其他的容器实现的容器,在底层容器实现适配器容器的功能,实际上可以将其作为一个一般的容器去使用。后进后出(只能从顶部出入)
1)stark 栈容器:
后进后出默认的底层容器是deque,(当然也可以指定其他的容器作为stark的底层容器)
只有简单的pop()出栈;push()入栈;empty();size()
2)queue队列容器:先进先出。
插入的元素在队尾,pop()出的元素在队首。
3)priority_queue(优先队列容器)
可随意顺序入队列但是一旦进入就会被排序(按照值的大小排序)
在这个里面使用pop()来找到队伍最前面的(也是最大值的)