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


前置知识:    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. ElasticSearch搜索介绍四

    ElasticSearch搜索 最基础的搜索: curl -XGET http://localhost:9200/_search 返回的结果为: { "took": 2, &quo ...

  2. Swagger介绍-一套流行的API框架

    简介 号称:世界最流行的API框架 官网:http://swagger.io/ 解决什么问题:在前后台分离的开发模式中,减小接口定义沟通成本,方便开发过程中测试,自动生成接口文档. 实例代码位置:ht ...

  3. python---生成验证码图片

    工具插件verifycode.py中,记得使用时需要在路由根目录中引入文字资源文件 # coding:utf8 # __author: Administrator # date: // # /usr/ ...

  4. spring @Entity @Table

    import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; impor ...

  5. 【转载】掌握 HTTP 缓存——从请求到响应过程的一切(下)

    作者:Ulrich Kautz 编译:胡子大哈 翻译原文:http://huziketang.com/blog/posts/detail?postId=58bd4dd1204d50674934c3b0 ...

  6. 如何使用less(变量,混合,匹配,运算,嵌套...)

    如何使用less及一些常用的(变量,混合,匹配,运算,嵌套...) less的介绍及编译工具 什么是less 1.LESSCSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法, ...

  7. Linux - 文件ACL权限控制

    getfacl 1.test # 查看文件ACL权限 setfacl -R -m u:xuesong:rw- 1.test # 对文件增加用户的读写权限 -R 递归

  8. Linux常用命令(一)查看日志

    当日志文件存储很大时,需要Linux命令查看: Log 在目录 /var/log/   下 常用命令: tail head grep sed cat tac https://blog.csdn.net ...

  9. mysql 案例~mysql主从复制延迟处理(2)

    一 简介:今天来聊聊周期性从库延迟的问题,是上一篇的基础分析的一个场景 二 背景:近期每天的指定时间段,收到从库延迟的报警,然后过一段时间恢复.由于从库是提供读服务的,所以需要解决 三 分析思路: 1 ...

  10. HTML中Meta标签中http-equiv属性

    HTML中Meta标签中http-equiv的用法: <meta http-equiv="这里是参数" content="这里是参数值"> 1.Ex ...