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 这些容器完全支持使用内置类型和指针(指针注意内存泄露问题). 就是说乱用智能指针 ...
随机推荐
- 【LeetCode】436. Find Right Interval 解题报告(Python)
[LeetCode]436. Find Right Interval 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: h ...
- 【项目管理】《IT项目管理》Kathy Schwalbe 第1章 总论
博主:海底淤泥 1.为什么项目管理领域引起了大家的兴趣 1.更好控制财力.物力.人力资源 2.改进客户关系 3.缩短开发时间 4.降低成本和提高生产率 5.提高质量和可靠性 6.更大的边际利益空间 7 ...
- 编写Java程序,现要求使用 dom4j 解析 city.xml 文档,实现省份及对应城市的联动特效,效果如图所示
查看本章节 查看作业目录 需求说明: 现要求使用 dom4j 解析 city.xml 文档,实现省份及对应城市的联动特效,效果如图所示 实现思路: 创建解析 XML 文档类 ParseXML 和窗体类 ...
- MySQL支持IPv6
开启和验证MySQL支持IPv6的方法, 此处使用的MySQL版本为mysql-5.5.35-linux2.6-x86_64. 1.验证操作系统支持IPv6,此处是Linux操作系统 ping6 :: ...
- Hadoop编译打包记录
Hadoop编译打包,基于2.7.2版本的源码. # 打包过程中需要使用到的工具 java -version mvn -version ant -version type protoc type cm ...
- Typescript 字符串字面量类型
字符串字面类型定义的类型是固定的,在其使用时必须是其定义的其中一个字符串,否则会报错 当传入一个定义之外的字符串时,会报错字符串字面量类型.ts(13,20): error TS2345: Argum ...
- js_给元素增加或移除style属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- sqlserver - 查出的结果集,集成为json串放在一个字段里
1.效果 2.sql SELECT top 20 (select [name] as [名字] from staffBasicInfo For JSON PATH,ROOT('第一级key')) k ...
- github 创建网络仓库 ,使用git工具将本地文件上传/删除 --- 心得
1.前言 使用 git做项目控制版本工具,当然,使用SVN也可以,但是,git让人感觉更先进一些,与GitHub结合,用起来很方便,服务端由官网控制. 而SVN分客户端和服务端,都是个人控制,因此, ...
- react中实现css动画