STL总结

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;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值