STL常用容器用法

时间:2021-02-09 01:00:04

-1.

本文章中所有函数原型均为C++98的标准。

  1. 通用的操作
//遍历容器——以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();
  1. 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()
  1. queue&stack&vector

十分常用且过于简单,略。

注意在执行pop等操作时要判空。

vector不能访问超出范围的下标,会直接报错。

  1. priority_queue

看这里

注意priority_queue是一个堆,因此要用top();而queue就是front()和back()。

  1. deque

写单调队列的时候要用……其他的就没什么用处了吧

函数名基本同list中“简单的功能”

  1. (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()。

这两个函数都已经熟知了,一个返回第一个不小于,一个返回第一个大于。

另外注意返回的是迭代器而不是值。

  1. (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常用容器用法的更多相关文章

  1. C&plus;&plus; STL常用容器基本用法汇总

    1.vector 包含头文件#include<vector> 使用命名域using namespace std 定义元素类型为T的vector vector<T> vec 增: ...

  2. C&plus;&plus;STL 常用 函数 用法

    学完c++快一年了,感觉很有遗憾,因为一直没有感觉到c++的强大之处,当时最大的感觉就是这个东西的输入输出比C语言要简单好写. 后来我发现了qt,opencv,opengl,原来,c++好玩的狠. 在 ...

  3. C&plus;&plus;中STL常用容器的优点和缺点

    我们常用到的STL容器有vector.list.deque.map.multimap.set和multiset,它们究竟有何区别,各自的优缺点是什么,为了更好的扬长避短,提高程序性能,在使用之前需要我 ...

  4. C&plus;&plus; STL常用容器浅析

    首先要理解什么是容器,在C++中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对象的指针,这种对象类型就叫做容器.简单来说 容器就是包含其他类的对象们的对象,当然这种(容器) ...

  5. STL常用容器使用方法

    在程序头部使用#include<stack>来引入STL的stack容器,然后使用stack<int> s语句来声明一个管理整型数据的容器s.stack常用成员函数:push( ...

  6. 【C&plus;&plus;】STL常用容器总结之五:双端队列deque

    6.双端队列deque 所谓的deque是”double ended queue”的缩写,双端队列不论在尾部或头部插入元素,都十分迅速.而在中间插入元素则会比较费时,因为必须移动中间其他的元素.双端队 ...

  7. C&plus;&plus;中STL常用容器的区别(转)

    我们常用到的STL容器有vector.list.deque.map.multimap.set和multiset,它们究竟有何区别,各自的优缺点是什么,为了更好的扬长避短,提高程序性能,在使用之前需要我 ...

  8. c&plus;&plus; STL 常用容器元素类型相关限制 指针 引用

    c++ 的 STL 中主要有 vector , list, map, set  , multimap,multiset 这些容器完全支持使用内置类型和指针(指针注意内存泄露问题). 就是说乱用智能指针 ...

  9. C&plus;&plus;STL 常用 函数 用法(转)

    http://www.cnblogs.com/duoduo369/archive/2012/04/12/2439118.html 迭代器(iterator) 个人理解就是把所有和迭代有关的东西给抽象出 ...

随机推荐

  1. HDU 1166 敌兵布阵&lpar;线段树单点更新&rpar;

    敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...

  2. 手动实现WCF&lbrack;转&rsqb;

    由于应用程序开发中一般都会涉及到大量的增删改查业务,所以这个程序将简单演示如何在wcf中构建简单的增删改查服务.我们知道WCF是一组通讯服务框架,我将解决方案按大范围划分为服务端,客户端通过服务寄宿程 ...

  3. 批处理SQL语句

    作用:想发送多条SQL,又要降低与数据库系统的交互,这时使用批处理        一]Statement对象——适合对不同结构的SQL语句进行批处理操作        步骤:            1 ...

  4. Android Studio 入门(转)

    本文适用于从Eclipse转AndroidStudio的开发者 最近打算写一个系列的android初级开发教程,预计40篇以上的文章,结合我实际工作中的经验,写一些工作中经常用到的技术,让初学者可以少 ...

  5. jmockit 模拟同一个函数多次调用每次返回不同结果

    new Expectations(){{ calendarService.getGeneralCalendar((Date)any); returns(null, new AbrahamResult& ...

  6. python 连接 hive 的 HiveServer2 的配置坑

    环境: hadoop 2.7.6 hive 2.3.4 Hive 的 thirft 启动: hadoop 单机或者集群需要: 启动 webhdfs 修改 hadoop 的代理用户 <proper ...

  7. 在 JNI 编程中避免内存泄漏与崩溃

    JNI 编程简介 JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互——在 Java 程序中 ...

  8. msql 计算连续签到天数

    刚刚写了一个签到计算天数的sql, 记录下来. 思路如下: 获取当前签到的最后时间(今天或昨天), 定义一个变量@i 对签到时间进行天数自减, 然后查询出当前记录签到时间是否与自减后的时间匹配.   ...

  9. c&plus;&plus;对拍实现

    直接上代码吧. #include<bits/stdc++.h> using namespace std; int main(){ while(1){ system("./cute ...

  10. mysql 查询语句去重 通过sql去重

    url 在表中具有唯一性: 由于定时任务的多进程/代码的多线程/定时任务的调度/脚本的执行时间,导致,破坏了唯一性: SELECT COUNT(1) FROM test_error_tmpUNION ...