stl是一个标准模板库,就是许多容器、算法等的集合。
容器(container)大致上有list、vector、set、map等。而算法(algorithm)里面则提供了很多用于简便算法的操作,比如我们最常见的sort等。最后,stl里面还有一个十分重要的组件,那就是迭代器(iterator)。迭代器是算法跟容器的粘合剂,没有迭代器,很多容器都很难使用算法。
定义集合类型(stl)变量,基本上都是:
集合类型<数据类型>数据名称;
这种定义方式。并且通过点的方式来调用,比如:a.push();
1.堆栈stack
栈是一种后进先出的LIFO表。在stl中,栈是以别的容器作为底部结构,再将接口改变(提供自己的接口),使之符合栈的特性。栈在不指定容器时,默认以deque为底层数据结构。栈的栈顶在最后面,对数据进行的操作都在那里进行。
常用函数:
(1)头文件:<stack>。
(2)定义stack类型数据:stack<int> s;
(3)进栈:s.push();
(4)退栈:s.pop();
(5)判断栈内元素个数s.size();
(6)判断栈是否为空s.empty();bool类型的函数,空返回true,非空返回false。
(7)返回栈顶:s.top();
(8)复制stack内数据:stack<Elem> c1(c2);将c2数据复制给c1;
2.队列
queue单向队列与栈类似,不同的是队列可以在一端存入数据,另一端取出数据。总之,queue数据遵循先进先出原则,常作为别的容器的底部结构。
常用函数:
(1)定义:queue<数据类型> 数据名称。
(2)复制queue:queue<Elem> c1(c2);用法类似于stack。
(3)返回队列头部数据:c.front();
(4)返回最后一个元素:c.back();
(5)尾部添加数据:q.push(Elem);
(6)头部删除数据:c.pop();//注意此时的头部与stack的头部位置不同。
(7)判断队列是否为空:c.empty();
(8)返回队列中数据个数:c.size();
3.优先队列
跟队列相似,但是会进行一个(二叉?)排列,把权值最高的排在前面。
优先队列一般是升序排列,加上greater<Elem>之后可以强制设为降序排列。在使用结构体时,set与它都要自己重载运算符,自己定义一个运算比较规则。
优先队列排序时,放入的元素与最顶层比较在放,左大右小(??),同层之间不比较。删去最大数之后,会从最小的一个开始比较(右下的那一个),与上一层比较,然后转换。因为数据从上到下是递减的,虽然不是一个个的顺序递减,但是这样依然可以找到最大(最小)的数值。
基本函数:
(1)定义:priority_queue<Elem> c;
(2)返回头部元素:c.top();
(3)尾部增加元素:c.push(Elem);
(4)删除队头元素:c.pop();
(5)是否为空:c.empty();
(6)返回数据个数:c.size();
(7)注意无返回队尾元素!!!
4.动态数组<vector>
向量有数组和stl两种用法。
数组的访问效率更高(利用下标:v[i]),并且随着元素的增添或者删除会自动调整数组的大小,但是频繁这样转换会降低效率。
也常常使用迭代器进行一些操作。
基本函数:
(1)定义:vector<Elem> v2(v1); / vector<> v2=v1; //定义时直接整体赋值。
vector<> v(n,val);初始化为n个val;
vector<> v;n个初始化(数组大小为n?)
vector<>v5(=这个等号可有可无){a,b,c……};
(2)尾部插入元素a:v.push_back(a);
(3)尾部删除元素:pop_back();
(4)(迭代器)任意插入元素:v.insert(v.begin(),0);//头部插入
(5)(迭代器)任意删除:v.erase(v.begin(),v.end());//全删,写一个就是只删那一位。
(6)清除:v.clear();
(7)基操:v.size();v.empty();
(8)调整大小,大则删除,小则添加:v.resize();
5.集合set或者multiset
他们可以根据排序准则自动排序,set不允许元素重复而multiset允许元素重复。默认从小到大,可以重载小于号。
基本操作:
(1)定义:set<> s;
(2)插入元素:s.inert(elem);
(3)移出与elem相同的元素返回被移除值的个数:s.erase(elem);//当elem这里是迭代器时,移除迭代器上的元素且没有返回值。
(4)全部清空:s.clear();
迭代器参与的操作:
(1)定义:set<int>::iterator pos;
(2)查找:pos=s.find(elem);//利用二分查找,返回元素所在的位置。
(3)查看元素个数:s.count(elem);
(4)查找:s.lower_bound(elem);//返回>=elem的第一个元素的位置;
s.upper_bound(elem);//返回>elem的第一个元素的位置。
(5)s.begin(); s.end(); s.size(); s.empty()等基操。
6.映射map和multimap
根据元素键值自动排序,map的所有元素都是pair。pair的第一个元素叫键值,相当于数组的下标,第二个是实值。map不允许两个相同的键值,但是multimap允许。
基本函数:
(1)定义map:map<类型1,类型2> 名称。
(2)s.size(); s.empty(); s.begin(); s.end(); 等基操
(3)返回键值为k的元素个数:m.count(k);
(4)移除元素:同set的erase的操作。
(5)存储数据:
m[key]=value;
insert的存储:
①m.insert(map<string,float>::value_type("robin",22.3));
②m.insert(pair<string,float>("rubin",22.3));
③m.insert(make_pair("rubin",22.3));
映射的时候使用键值,输出实值。想要输出键值,可以:
m->first来输出键值。同样的可以用m->second来输出实值。
特别:重载小于号
struck new_type
{
int x,y;
bool operator<(const new_type &a)const
{
if(x!=a.x) return x<a.x;
else return y<a.y;
}
}