STL常用容器用法
-1.
本文章中所有函数原型均为C++98的标准。
- 通用的操作
//遍历容器——以vector,map为例
vector<int> vt;
map<int,int> mp;
for(vector<int>::iterator it=vt.begin();it!=vt.end();it++)printf("%d ",*it);
printf("\n");
for(map<int,int>::iterator it2=mp.begin();it2!=mp.end();it2++)printf("%d %d\n",it2->first,it2->second);
//empty(),size()和clear()函数通用——以queue为例
queue<int> q;
while(!q.empty){//do sth}
printf("%d\n",q.size());
q.clear();
- list
list<int> ls;
//一些简单的功能
ls.push_front(3);//3
ls.push_front(4);//4 3
ls.push_back(5);//4 3 5
ls.pop_front();//3 5
printf("%d %d\n",ls.front(),ls.back());//3 5
ls.pop_back();//3
//最为重要的功能——O(1)插入(给定位置和数值)和删除(给定位置)
list<int>:iterator it=ls.begin();
ls.insert(it,2);//2 3
//注意:新的数插入到迭代器之前的位置;但迭代器依旧指向3
ls.erase(it);//2
//迭代器会指向被删除数的后面
//这里it==ls.end()
- queue&stack&vector
十分常用且过于简单,略。
注意在执行pop等操作时要判空。
vector不能访问超出范围的下标,会直接报错。
- priority_queue
看这里
注意priority_queue是一个堆,因此要用top();而queue就是front()和back()。
- deque
写单调队列的时候要用……其他的就没什么用处了吧
函数名基本同list中“简单的功能”
- (multi)set
unordered_开头的东西似乎csp/noip都不太能用,而且有被卡的风险(悲
(multi)set和之后的(multi)map内部都是用红黑树实现,故基本都是log级别的
set和multiset使用起来比较简单,它们支持的函数也都相同(只不过有些在set里没用)
注意有重复元素的时候要用multiset,别被set的自动去重坑了=_=
set和multiset的insert和erase都能直接指定值,不需要给定迭代器(即位置)。
但是multiset的erase会直接把所有是指定值的都删掉。这可能不是我们所期望的。
解决这个问题的方法就是用find()(下面会说)找到一个值并且直接单独给定迭代器删除即可。
但是,(multi)set的最为有用的操作还是下列五个函数:
iterator find (const value_type& val) const;
size_type count (const value_type& val) const;
iterator lower_bound (const value_type& val) const;
iterator upper_bound (const value_type& val) const;
pair<iterator,iterator> equal_range (const value_type& val) const;
接下来一个一个予以剖析。
首先是find()、equal_range()和count()函数。
find()只会找到一个值所对应的迭代器(这就是为什么上面的操作成立的理由);
而equal_range()会直接将所有对应的值的迭代器都找出来,并返回首和尾方便迭代。
至于count()显然就是统计数量了。
显然,set中只有count()(或find(),看个人习惯)判定元素是否在set中有用,而multiset中三个都有用处。
另外需要注意,equal_range()返回的pair的second实际上会比对应的值往后一格,这样方便迭代。具体代码如下:
multiset<int> st;
st.insert(10);st.insert(10);st.insert(20);st.insert(20);
st.insert(30);st.insert(30);st.insert(30);st.insert(30);
pair<multiset<int>::iterator,multiset<int>::iterator> qwq;
qwq=st.equal_range(30);
for(multiset<int>::iterator it=qwq.first;it!=qwq.second;it++)printf("%d ",*it);//30 30 30 30
接下来是lower_bound()和upper_bound()。
这两个函数都已经熟知了,一个返回第一个不小于,一个返回第一个大于。
另外注意返回的是迭代器而不是值。
- (multi)map
所拥有的函数和(multi)set基本相同。
但是要注意(multi)map中的一个值是包含了key和value两部分,因此操作会复杂一点。
同时,由于一个value可能会对应多个key,故不支持通过value快速找key。
遇到这种情况,通常需要建立一正一反两个(multi)map。
另外要注意,通过迭代器访问元素时,要使用:
it->first
it->second
map的常用函数:
mapped_type& operator[] (const key_type& k);//用map[key]=value的形式插入元素
pair<iterator,bool> insert (const value_type& val);//不常用,插入元素用上面的[]运算符就行。
//但是注意这个函数的返回值,insert函数会返回是否已经有了对应的key,和已经对应的迭代器
void erase (iterator position);//通过迭代器删除
size_type erase (const key_type& k);//通过key删除
size_type count (const key_type& k) const;//用来判定map中是否有key
multimap的常用函数:
iterator insert (const value_type& val);//multimap中不支持[]运算符,故只能通过insert插入。
map.insert(make_pair(key,value));//具体方法
void erase (iterator position);//通过迭代器删除(删一个)
size_type erase (const key_type& k);//通过key删除(所有key对应的value全删)
iterator find (const key_type& k);//返回一个key对应的iterator
size_type count (const key_type& k) const;//同(multi)set
iterator lower_bound (const key_type& k);//都是通过key来找的
iterator upper_bound (const key_type& k);
pair<iterator,iterator> equal_range (const key_type& k);//好东西。给出了key所对应的全部value所在的区间。
STL常用容器用法的更多相关文章
- C++ STL常用容器基本用法汇总
1.vector 包含头文件#include<vector> 使用命名域using namespace std 定义元素类型为T的vector vector<T> vec 增: ...
- C++STL 常用 函数 用法
学完c++快一年了,感觉很有遗憾,因为一直没有感觉到c++的强大之处,当时最大的感觉就是这个东西的输入输出比C语言要简单好写. 后来我发现了qt,opencv,opengl,原来,c++好玩的狠. 在 ...
- C++中STL常用容器的优点和缺点
我们常用到的STL容器有vector.list.deque.map.multimap.set和multiset,它们究竟有何区别,各自的优缺点是什么,为了更好的扬长避短,提高程序性能,在使用之前需要我 ...
- C++ STL常用容器浅析
首先要理解什么是容器,在C++中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对象的指针,这种对象类型就叫做容器.简单来说 容器就是包含其他类的对象们的对象,当然这种(容器) ...
- STL常用容器使用方法
在程序头部使用#include<stack>来引入STL的stack容器,然后使用stack<int> s语句来声明一个管理整型数据的容器s.stack常用成员函数:push( ...
- 【C++】STL常用容器总结之五:双端队列deque
6.双端队列deque 所谓的deque是”double ended queue”的缩写,双端队列不论在尾部或头部插入元素,都十分迅速.而在中间插入元素则会比较费时,因为必须移动中间其他的元素.双端队 ...
- C++中STL常用容器的区别(转)
我们常用到的STL容器有vector.list.deque.map.multimap.set和multiset,它们究竟有何区别,各自的优缺点是什么,为了更好的扬长避短,提高程序性能,在使用之前需要我 ...
- 【Example】C++ STL 常用容器概述
前排提醒: 由于 Microsoft Docs 全是机翻.所以本文表格是我人脑补翻+审校. 如果有纰漏.模糊及时评论反馈. 序列式容器 序列容器是指在逻辑上以线性排列方式存储给定类型元素的容器. 这些 ...
- c++ STL 常用容器元素类型相关限制 指针 引用
c++ 的 STL 中主要有 vector , list, map, set , multimap,multiset 这些容器完全支持使用内置类型和指针(指针注意内存泄露问题). 就是说乱用智能指针 ...
随机推荐
- 1127 - Funny Knapsack
1127 - Funny Knapsack PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB ...
- Codeforces 919D:Substring(拓扑排序+DP)
D. Substring time limit: per test3 seconds memory limit: per test256 megabytes inputstandard: input ...
- rabbitmq-安装部署及基础操作
rabbitmq 官网: https://www.rabbitmq.com/ yum 安装 rabbitmq # centos7 # In /etc/yum.repos.d/rabbitmq.repo ...
- 论文翻译:2020_Joint NN-Supported Multichannel Reduction of Acoustic Echo, Reverberation and Noise
论文地址:https://ieeexploreieee.fenshishang.com/abstract/document/9142362 神经网络支持的回声.混响和噪声联合多通道降噪 摘要 我们考虑 ...
- Capstone CS5268DEMOBOARD原理图|TYPEC转HDMI+VGA+PD3.0+USB3.0扩展坞方案
Capstone CS5268DEMOBOARD原理图|TYPEC转HDMI+VGA+PD3.0+USB3.0四合一设计参考 CS5268 是typec转HDMI+VGA+pd3.0+U3四合一拓展坞 ...
- Linux无法登陆,var目录权限修改导致SSH失败
1.问题说明 Linux远程服务器突然无法SSH登录了, 登陆报错: ssh_exchange_identification: read: Connection reset by peer. 2.问题 ...
- Typescript Record的用法
Record<Keys,Type> 构造一个对象类型,其属性key是Keys,属性value是Tpye.被用于映射一个类型的属性到另一个类型 interface CatInfo { age ...
- PPT制作手机滑动效果
原文链接: https://www.toutiao.com/i6495341287196066317/ 我们添加一个手机图片 选择"插入"选项卡,插入两条直线,如下图所示.插入直线 ...
- 基于Apache Hudi + Flink的亿级数据入湖实践
本次分享分为5个部分介绍Apache Hudi的应用与实践 实时数据落地需求演进 基于Spark+Hudi的实时数据落地应用实践 基于Flink自定义实时数据落地实践 基于Flink+Hudi的应用实 ...
- MySQL常用内置函数整理
[1]@@datadir 函数作用:返回数据库的存储目录构造SQL语句 select @@datadir;ps:@@basedir返回mysql的根目录[2]@@version_compile_os ...