转载请注明出处,部分内容引自李煜东《算法竞赛进阶指南》


前置知识:    C++、C语言入门


Map是什么

Map是从键(key)到值(value)的映射,其内部实现是一棵以key为关键码的红黑树

Map的相关操作

头文件

#include<map>

声明:

像这样:

map<key的类型,value的类型>名称;
比如:
map<long long,bool>mp;
map<string,int>mp;
map<pair<int,int>,vector<int>>mp;

就像其他需要排序的数据类型一样,key为一个结构体的map,需要重载小于号

struct pos{
int x,y,s;
string move[];
};
map<pos,int>mp;
bool operator <(const pos &ai,const pos &bi)
{
return (ai.x==bi.x)?ai.y>bi.y:ai.x>bi.x;
}

[]运算符

map重载了[]运算符,map[key]返回key到value的引用,时间复杂度O(log n)
[]操作符是map最吸引人的地方。我们可以很方便地通过map[key]来得到key对应的value,还可以对map[key]进行赋值操作,改变key对应的value。
若查找的key不存在,则执行map[key]后,map会自动新建一个二元组(key,zero),并返回zero的引用。

eg.
map<string,int>mp;
for(int i=;i<=n;i++)
{
string s;
int num;
cin>>s>>num;
mp[s]=num;
}
for(int i=;i<=m;i++)
{
string s;
cin>>s;
cout<<mp[s]<<endl;
}

map.size()

统计map中元素个数,函数返回一个整形变量,表示map中元素个数,时间复杂度O(1)

用法:名称.size();
eg.
int num=mp.size();

map.empty()

检查map是否为空,返回一个bool型变量,1表示map为空,否则为非空,时间复杂度O(1)

用法:名称.empty();
eg.
if(mp.empty())
cout<<"Mymap is Empty."<<endl;

map.clear()

清空map,无返回值

用法:名称.clear();
eg.
mp.clear();

map.count(x)

返回map中key为x的元素个数,时间复杂度为O(log n)

用法:名称.count(x)
eg.
if(!mp.count(x))
mp[x]=;

迭代器

双向访问迭代器,不支持随机访问,支持星号解除引用,仅支持“++”,“--”这两个算术操作

引用和操作:

map<类型,类型>::iterator it;
eg.
map<int,int>::iterator it=mp.begin();
it++;
it--;

若把it++,则it将会指向“下一个”元素。这里的下一个是指在key从小到大排序的结果中,排在it下一名的元素。同理,若把it--,则it会指向排在上一个的元素
“++”,“--”操作的复杂度均为O(log n)
对map的迭代器解除引用后,将得到一个二元组pair<...,...>

遍历map及访问其中的元素

for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++)
if(it->second==ans) //访问二元组中第二个,即value
cout<<it->first<<endl; //访问key

map.find(x)

在map中查找key为x的二元组,并返回指向该二元组的迭代器,若不存在,返回map.end(),时间复杂度为O(log n)

用法:名称.find(x);
eg.
if(mp.find(s)!=mp.end())
cout<<"Have Found!"<<endl;

map.insert(pair<...,...>)

在map中插入,参数是pair<key.type,value.type>,返回插入地址的迭代器和是否插入成功的bool并成的pair,时间复杂度为O(log n)
PS:insert在进行插入的时候是不允许有重复的键值的,如果新插入的键值与原有的键值重复则插入无效

用法:名称.insert(pair<key的类型,value的类型>);
eg.
mp.insert(make_pair(,));

map.erase(参数)

删除,参数可以是pair或者迭代器,返回下一个元素的迭代器,时间复杂度为O(log n)

用法:名称.erase(参数);
eg.
map<int,int>::iterator it=mp.begin();
mp.erase(it);
mp.erase(make_pair(,));

STL整理之map的更多相关文章

  1. STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)(转)

    向量(vector) <vector> 连续存储的元素<vector> Vector<int>c; c.back()    传回最后一个数据,不检查这个数据是否存在 ...

  2. C++STL整理

    STL整理 vector #include<bits/stdc++.h> #define go(i,a,b) for(int i=a;i<b;i++) using namespace ...

  3. UVa 11991:Easy Problem from Rujia Liu?(STL练习,map+vector)

    Easy Problem from Rujia Liu? Though Rujia Liu usually sets hard problems for contests (for example, ...

  4. STL中的map、unordered_map、hash_map

    转自https://blog.csdn.net/liumou111/article/details/49252645 在之前使用STL时,经常混淆的几个数据结构,特别是做Leetcode的题目时,对于 ...

  5. [知识点]C++中STL容器之map

    UPDATE(20190416):写完vector和set之后,发现不少内容全部引导到map上了……于是进行了一定的描述补充与更正. 零.STL目录 1.容器之map 2.容器之vector 3.容器 ...

  6. STL 中的map 与 hash_map的理解

    可以参考侯捷编著的<STL源码剖析> STL 中的map 与 hash_map的理解 1.STL的map底层是用红黑树存储的,查找时间复杂度是log(n)级别: 2.STL的hash_ma ...

  7. STL中的map和unordered_map

    STL中的map和unordered_map map 头文件:#include 原理:std::map的内部实现了一颗红黑树,有对其键值进行排序的功能,所以map是一个有序的容器,map中的每一个元素 ...

  8. Linux环境下stl库使用(map)

    例子1: testMap.cpp #include <string.h> #include <iostream> #include <map> #include & ...

  9. STL整理

    sort 升序排列: iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素. iterator up ...

随机推荐

  1. POJ1185 状压dp(二进制//三进制)解法

    很显然这是一道状压dp的题目 由于每个最优子结构和前两行有关,一个显而易见的想法是用三维dp[i][j][k]用来记录在第i行下为j状态,i - 1行为k状态时的最大值,然而dp[100][1 < ...

  2. javascript 迭代与递归

    <script type="text/javascript"> // //原生js // window.onload = function(){ // var btn ...

  3. vs2017_enterprise正式版离线安装包bt下载

    vs2017_enterprise正式版离线安装包bt下载 点击这里下载种子 磁力链接 安装前请先打开certificates目录,安装里面的三个证书 离线下载教程 : https://docs.mi ...

  4. servlet dispatcher .forward(request, response); 进入其它servlet【原】

    dispatcher .forward(request, response); 进入其它servlet 假如我们的web.xml配置如下 <servlet> <servlet-nam ...

  5. 让div固定在顶部不随滚动条滚动【转】

    让div固定在顶部不随滚动条滚动 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...

  6. Hystrix介绍以及服务的降级限流熔断

    (dubbo熔断,Hystrix问的少) 无论是缓存层还是存储层都会有出错的概率,可以将它们视同为资源.作为并发量较大的系统,假如有一个资源不可用,可能会造成线程全部 hang (挂起)在这个资源上, ...

  7. OSI七层模型与TCP/IP四层模型

    OSI七层模型与TCP/IP四层模型 OSI模型(Open System Interconnection Reference Model,缩写为OSI),全名“开放式系统互联通信参考模型”,是一个试图 ...

  8. 自动提取文件系统---binwalk(一)

    Binwalk是路由器固件分析的必备工具,该工具最大的优点就是可以自动完成指定文件的扫描,智能发掘潜藏在文件中所有可疑的文件类型及文件系统. 1.Binwalk和libmagic Binwalk的扫描 ...

  9. json 不能 dumps Decimal 解决办法

    class DecimalEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, decimal.Decimal): ret ...

  10. luogu P3198 [HNOI2008]遥远的行星

    bzoj 洛谷 这题意是不是不太清楚 真正题意:求\[f_i=\sum_{j=1}^{\lfloor i*A \rfloor} \frac{M_i*M_j}{i-j}\] 似乎只能\(O(n*\lfl ...