stl容器的介绍及使用


提示:以下是本篇文章正文内容,下面案例可供参考

一、容器

1.容器是什么?

容器:可容纳各种数据类型的数据结构。
容器可大致分为三大类:
顺序容器:
vector(后部插入/删除,可直接访问)
deque(前/后部插入/删除,可直接访问)
list(双向链表,任意位置插入/删除)
关联容器:
set:快速查找,无重复元素,有序
unordered_set:set快,无重复元素,无序
multiset:快速查找,可有重复元素。
map:一对一,无重复元素,用关键字查找
unordered_map:比map快
multimap:一对一,可有重复元素,关键字查找
容器适配器:
stack:栈先进后出
queue:队列先进先出
priority_queue:优先队列

二、使用容器的操作

顺序容器

vector的操作方法:

定义vector变量:vector<数据类型>a
例如:

vector<int>a;//创建一个大小为空的对象a
vector<int>a(n)//创建一个大小为n的对象a
vector<vector<int> >a(n,vector<int>(m))//创建一个大小为n,m的二维数组,相当于a[n][m]

还可以进行以下操作:

vector<int>a;
a.push_back()//向容器末尾加一个新元素
a.emplace_back()//向容器末尾加一个新元素
a.pop_back()//删除容器末尾元素
a.front()//返回容器第一个元素的引用
a.back()//返回容器最后一个元素的引用
a.begin()//返回容器第一个元素的迭代器(迭代器可通过*进行引用)例如*(a.begin()==a.front())
a.end()//返回最后一个元素后面一位的迭代器
find(a.begin(),a.end(),x)//返回值为目标元素x的迭代器
max_element(a.begin(),a.end())//获取数组中最大元素
min_element(a.begin(),a.end())//同理
sort(a.begin(),a.end())//默认从小到大排序
sort(a.begin(),a.end(),comp)//根据comp函数排序
//例如:
bool comp(int x,int,y){
 return x>y;
}

bool operator <(const node&x )const{
    if(x.fi==fi)return x.se>se;
    return  x.fi<fi;
}
//这样操作后a从大到小排序,当然还有按各种方法排序,只需你对comp操作就行
//下面两个操作要a为有序
a.lower_bound(k)//即返回值不小于k的第一个元素的迭代器,
a.upper_bound(k)//即返回值大于k的第一个元素的迭代器
a.size()//获取a的元素个数
a.clear()//清空当前容器

deque的操作方法:

所有的适用于vector的操作都适用于deque
在此基础上还有push_front()(将元素插到最前面)和pop_front()(删除最前面元素)的操作

deque<int>a;
a.push_front()//(将元素插到最前面
a.pop_front()//删除最前面元素
a.push_back()//向容器末尾加一个新元素
a.emplace_back()//向容器末尾加一个新元素
a.pop_back()//删除容器末尾元素
a.front()//返回容器第一个元素的引用
a.back()//返回容器最后一个元素的引用
a.begin()//返回容器第一个元素的迭代器(迭代器可通过*进行引用)例如*(a.begin()==a.front())
a.end()//返回最后一个元素后面一位的迭代器
find(a.begin(),a.end(),x)//返回值为目标元素x的迭代器
max_element(a.begin(),a.end())//获取数组中最大元素
min_element(a.begin(),a.end())//同理
sort(a.begin(),a.end())//默认从小到大排序
sort(a.begin(),a.end(),comp)//根据comp函数排序
//例如:
bool comp(int x,int,y){
 return x>y;
}
//这样操作后a从大到小排序,当然还有按各种方法排序,只需你对comp操作就行
//下面两个操作要a为有序
a.lower_bound(k)//即返回值不小于k的第一个元素的迭代器,
a.upper_bound(k)//即返回值大于k的第一个元素的迭代器
a.size()//获取a的元素个数
a.clear()//清空当前容器

list的操作方法:

定义list:

list<int>a;          //创建空list   
list<int>a(n);       //创建含有n个元素的list

list的一些基本操作:

a.sort() //给list排序 ,(list不支持stl的算法sort)
a.assign() //给list赋值 
a.back() //返回最后一个元素
a.begin() //返回指向第一个元素的迭代器 **
a.clear() //删除所有元素 
a.empty() //如果list是空的则返回true 
a.end() //返回末尾的迭代器 \nLst1.erase() 删除一个元素 
a.front() //返回第一个元素
a.get_allocator()// 返回list的配置器 
a.insert() //插入一个元素到list中 
a.max_size() //返回list能容纳的最大元素数量 
a.merge() //合并两个list 
a.pop_back()// 删除最后一个元素 
a.pop_front() //删除第一个元素 
a.push_back() //在list的末尾添加一个元素 
a.push_front()// 在list的头部添加一个元素 
a.rbegin() //返回指向第一个元素的逆向迭代器 
a.remove() //从list删除元素 **
a.remove_if()// 按指定条件删除元素 
a.rend() //指向list末尾的逆向迭代器 
a.resize() //改变list的大小 
a.reverse() //把list的元素倒转 
a.size() //返回list中的元素个数 
a.splice() //合并两个list 

(关联容器)set,multiset,map,multimap,unordered_set,unordered_map

内部元素有序排列(有序是指键值有序),unordered_map/set无序,查找速度快
map关联数组:元素通过键值来储存和读取 例如:a[k]=v;
set大小可变的集合,无重复元素
multimap支持同一个键多次出现的map类型
multiset支持同一个键多次出现的set类型

以map为例

map<int,int>a//k为a的键值,v为a的值
a.find(k)//返回值为键值为k的元素的迭代器,如果不存在k,返回end()
a.lower_bound(k)//即返回键值不小于k的第一个元素的迭代器,
a.upper_bound(k)//即返回键值大于k的第一个元素的迭代器
a.count(k)//返回a中k的数量
a.insert(k)//插入元素k
//当然使用map时可以用a[k]=v;即下表法取值

补充:当map使用迭代器访问时键值用first,值用second
例如:map<int,int>a;
map<int,int>::iterator it=a.begin()
*it.first=kay;
*it.second=val;

容器适配器

stack

stack可用vector,deque,list实现
先进后出

stack<int> a; //以int型为例
int x;
a.push(x);  //将x压入栈顶
a.top();  //返回栈顶的元素
a.pop();  //删除栈顶的元素
a.size();  //返回栈中元素的个数
a.empty();  //检查栈是否为空,若为空返回true,否则返回false

queue

和stack基本一致
先进先出

queue<int> a; //以int型为例
int x;
a.push(x);  //将x入队
a.front();  //返回队首的元素
a.back();//返回队尾元素
a.pop();  //队首元素出队
a.size();  //返回队中元素的个数
a.empty();  //检查队是否为空,若为空返回true,否则返回false

优先队列 priority_queue

队列降序,大堆根(默认情况)
priority_queuea;
priority_queue<int,vector,less >a;
队列升序,小堆根
priority_queue<int,vector,greater >a;
若使用其他数据类型做priority_queue的例子时;
内部排序情况如下:
1.以pair<int,int>为元素时,内部先比较pair.first,然后比较pair.second,无需自己写判断函数;
2.以struct为元素时:

struct stu{
int a,b;
}p;
bool operator<(const stu&x,const stu&y){
if(x.a==y.b)return x.b<y.b;
else return x.a<y.a;
}
priority_queue <stu>a;

基本操作如下

a.top()// 访问队头元素
a.empty()// 队列是否为空
a.size() //返回队列内元素个数
a.push(x) //插入x到队尾 (并排序)
a.emplace(x) //原地构造一个元素x并插入队列
a.pop()// 弹出队头元素

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值