一篇总结,带你学习STL在acm中常用的容器及其方法

stl在acm中常用的容器及其方法

声明:因为是在acm编程的基础上使用,我就自己总结了一些常用的方法,并不能用来系统的学习stl的vector。

#容器类+函数
#序列性容器(deque list vector)、关联性容器(map set multiset multimap)、容器适配器(queue stack priority_queue)

#在学习这些容器的时候,一定要明白其数据结构的构造,以便于理解在什么情况下使用什么样的容器,以及使用容器如何对数据进行相应的操作。

虽然由多种容器,但函数还是基本相同的,当用的时候根据具体情况来使用相应的容器。

注:当使用容器类的时候,要记得一定要表明类型,如创建vector对象 vector v; //一定要表明int类型
再比如,使用迭代器的时候list::iterator it=l.begin(); //一定要表明int类型


一、 vector、deque、list

vector、deque、list 通有方法:

a在这里可以代表vector/deque/list任一个容器的对象。

push_back()和pop_back()

a.push_back(x) //末尾添加一个元素x
a.pop_back() //删除末尾的元素

front()和back()

a.front() //返回首元素的引用
a.back() //返回尾元素的引用

erase()

a.erase(a.begin()+i) //删除第i个元素
a.erase(a.begin()+i,a.begin()+j) //删除某一段元素,区间前闭后开 [i,j)

clear()

a.clear() //删除向量中所有元素

empty()

a.empty() //判断a是否为空

size()

a.szie() //返回a中元素的数目


1.1 vector容器类

创建vector对象

vector a; //创建一个int类型的vector对象,a本身就能做为一个数组的名称
vector a[10] //创建多个int类型的vector对象,相当于创建了十个数组

一个a就是一个vector容器

输出vector中的元素

代码实例:

#include
#include
#include
#include

using namespace std;
int main(){
    vector v;
    for(int i=0;i<=10;i++)
        v.push_back(i);

    //输出
    int l=v.size();
    for(int i=0;i

1.2 deque容器类(双端队列)

创建vector对象

deque d; //创建一个int型的deque对象
deque d[10] //创建多个int型的deque对象
一个d就是一个队列

push_front()和pop_front()

d.push_front() //在d首位添加一个元素
d.pop_front() //删除d的首位元素

输出deque中的元素

代码实例:

#include
#include
#include
#include

using namespace std;
int main(){
    deque d;
    for(int i=0;i<10;i++)
        d.push_back(i);

    //输出

    int l=d.size();
    for(int i=0;i

deque(双端队列)具有双端插入删除的性质,而后面降到的queue(队列)只有在尾部插入,在头部删除,先进先出


1.3 list容器类

创建list对象

list l; //创建一个list对象
list l[10]; //创建多个list对象

remove()

l.remove(x); //删除元素中所有元素值等于x的元素

sort()

l.sort() //容器中所有元素排序,默认为升序

unique()

l.unique() //容器内相邻元素若有重复的,则仅保留一个

reverse()

l.reverse() //翻转容器中元素的顺序

输出list中的元素

代码实例:

#include
#include
#include
#include

using namespace std;
int main(){
    list l;
    for(int i=0;i<=10;i++)
        l.push_back(i);

    //输出

    for(list::iterator it=l.begin();it!=l.end();it++)
        cout<<*it<<' ';
}

vector,deque,list都有end()和begin()函数,都可以使用迭代的方法来遍历元素。


二、 queue、stack、priority_queue(队列和栈优先队列)

queue、stack、priority_queue通有方法:

a在这里可以代表vector/deque/list任一个容器的对象。

empty()

a.empty(); //判空函数,返回值true或者false

size()

a.size(); //返回元素数量

push()

a.push(x) //在队尾(栈顶)添加元素x

pop()

a.pop()// 容器非空情况下,删除队头(栈顶)元素。

队列:队尾插入,队头删除。
栈:栈顶插入,栈顶删除。


2.1 stack(栈)

创建stack对象

stack s; //创建一个栈
stack s[10]; //创建多个栈

top()

s.top(); //当栈非空的时候,返回栈顶元素的引用。

stack代码实操

#include
#include
#include
#include
#include
#include

using namespace std;
int main(){
    stack s;
    for(int i=0;i<10;i++)
        s.push(i);

    //删除并输出
    int l=s.size();
    for(int i=0;i

2.2 queue(队列)

创建queue对象

queue q; //创建一个队列
queue q[10]; //创建多个队列

front()和back()

q.front() //队列非空时,返回队首元素的引用
q.back() //队列非空时,返回队尾元素的引用

queue代码实操

#include
#include
#include
#include
#include
#include

using namespace std;
int main(){
    queue p;
    for(int i=0;i<10;i++)
        p.push(i);

    //删除并输出
    int l=p.size();
    for(int i=0;i

2.3 priority_queue(优先队列)

创建priority_queue对象

priority_queue p; //创建一个优先队列
priority_queue p[10]; //创建多个优先队列

top()

p.top(); //优先队列非空的时候,返回优先级最高的元素的引用。

priority_queue代码实操

#include
#include
#include
#include
#include
#include

using namespace std;
int main(){
    priority_queue p;
    for(int i=0;i<10;i++)
        p.push(i);

    //删除并输出
    int l=p.size();
    for(int i=0;i

stack和priority_queue的输出操作相似,使用top()取元素。
queue没有top函数,只有front(),back()取两侧元素的操作。

三者都没有end()和begin()函数,所以不能使用迭代来遍历元素。


map、multimap、set、multiset(集合和映射)

set、multiset:集合,set不允许有重复元素,multiset允许有重复元素。
map、multimap:映射,mapkey=>value一对一的关系,multimapkey=>value1,value2...一对多的关系。

map、multimap、set、multiset通有方法

四者的函数名都相同,功能上由于集合和映射的性质不同而有所不同。

你可能感兴趣的:(C++STL基础及应用)