STL整理之map
转载请注明出处,部分内容引自李煜东《算法竞赛进阶指南》
前置知识: 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的更多相关文章
- STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)(转)
向量(vector) <vector> 连续存储的元素<vector> Vector<int>c; c.back() 传回最后一个数据,不检查这个数据是否存在 ...
- C++STL整理
STL整理 vector #include<bits/stdc++.h> #define go(i,a,b) for(int i=a;i<b;i++) using namespace ...
- 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, ...
- STL中的map、unordered_map、hash_map
转自https://blog.csdn.net/liumou111/article/details/49252645 在之前使用STL时,经常混淆的几个数据结构,特别是做Leetcode的题目时,对于 ...
- [知识点]C++中STL容器之map
UPDATE(20190416):写完vector和set之后,发现不少内容全部引导到map上了……于是进行了一定的描述补充与更正. 零.STL目录 1.容器之map 2.容器之vector 3.容器 ...
- STL 中的map 与 hash_map的理解
可以参考侯捷编著的<STL源码剖析> STL 中的map 与 hash_map的理解 1.STL的map底层是用红黑树存储的,查找时间复杂度是log(n)级别: 2.STL的hash_ma ...
- STL中的map和unordered_map
STL中的map和unordered_map map 头文件:#include 原理:std::map的内部实现了一颗红黑树,有对其键值进行排序的功能,所以map是一个有序的容器,map中的每一个元素 ...
- Linux环境下stl库使用(map)
例子1: testMap.cpp #include <string.h> #include <iostream> #include <map> #include & ...
- STL整理
sort 升序排列: iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素. iterator up ...
随机推荐
- OS + Linux RedHat 6 / redhat 6 configuration / configure / autoconf / make / make install
s These critical programs are missing or too old: as ld http://blog.csdn.net/testcs_dn/article/detai ...
- mysql 8.0.12 创建新的数据库、用户并授权
Mysql安装成功后,默认的root用户密码为空,你可以使用以下命令来创建root用户的密码: [root@host]# mysqladmin -u root password "new_p ...
- C#网络编程之进程管理
这里是视频讲解地址: 这里是代码: using System; using System.Collections.Generic; using System.Linq; using System.Ne ...
- Hbase记录-Hbase其他工具
1.RowCounter工具可以查看某张表有多少行,效率非常高 2.count命令在数据量大的时候效率非常差 执行./hbase org.apache.hadoop.habse.mapreduce. ...
- python-web开发环境搭建
一.安装distribute或setuptools,我用的distribute 下载链接:https://pypi.python.org/pypi/distribute [root@yeebian o ...
- java实现《剑指offer》(一)1~10
每段代码都是在牛客网在线编程通过后,然后拷过来的,准确性可以保证. 1.二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入 ...
- 关闭MySQL数据库的几种方法
#1.使用mysqldadmin mysqladmin -uroot -p shutdown mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/$ ...
- JAVA Socket 编程---Socket 和 ServerSocket
一,Socket Socket的选项 1) TCP_NODELAY:默认值为false.表示采用Negale算法.当设置为true时,表示关闭Socket缓冲,立即发送数据. Socket默认发送数据 ...
- Bootstrap -- 文件上传插件File Input的使用
BootstrapFileInput下载参考:http://www.jq22.com/jquery-info5231 网友经验参见:http://www.cnblogs.com/wuhuacong/p ...
- FastReport报表打印总页数的问题?
设置两次报表后加入引号内内容 "第[Page#]页 共[TotalPages#]页" 本站文章除注明转载外,均为本站原创或翻译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果 ...