用法

定义一个关联容器

需要分别包含头文件

#include<map>
#include<unordered_map>

map/unordered_map是一个关联容器,它按照特定顺序存储由键值和映射值的组合形成的元素;
在映射中,键值通常用于排序和唯一标识元素,而映射值存储与此键关联的内容。键和映射值的类型可能不同,并在成员类型value_type中组合在一起,这是一种结合两者的对类型:

typedef pair<const Key, T> value_type;

map容器通常比unordered_map容器慢,以便通过键访问单个元素,但它们允许根据子集的顺序直接迭代子集。 在该映射值地图可以直接通过使用其相应的键来访问括号运算符((操作符[] )。 映射通常如实施二叉搜索树。

key:每个元素都由其键值唯一标识。
T:这个键对应的值
和python中的字典差不多意思。

定义一个map/unordered_map对象

std::map<type1,type2> m;
std::unordered_map<type1,type2> u_m;

初始化

std::map<string,int> m({{'key1',1},{'key2',2}});
std::unordered_map<string,int> u_m({{'key1',1},{'key2',2}});
也可以先定义完再赋值

访问元素

用操作符[]访问,如:m[‘key1’];访问的得到的是key1对应的value。

往里面加入新的元素:

用insert插入:

//第一种m.insert ( std::pair<string,int>('akali',100) );u_m.insert ( std::pair<string,int>('ez',200) );
//第二种
std::map<string,int>::iterator it1 = m.begin();
std::map<string,int>::iterator it2 = u_m.begin();
m.insert (it1, std::pair<string,int>('bobi',300));
u_m.insert (it2, std::pair<string,int>('karsa',400));
//第三种std::map<string,int> anothermap;anothermap.insert(m.begin(),m.find('akali'));

还可以直接赋值进去:

m['aruma']=1;
u_m['qiqi']=38;

容器大小

m.max_size()//返回容器可以作为内容保存 的最大元素数。
m.size()//返回容器中的元素数量。
m.empty()//返回bool值,判断是否为空。

常用迭代器

begin():容器中第一个元素的迭代器。如果map对象是const限定的,则该函数返回一个const_iterator。否则,它返回一个迭代器。迭代器是一种泛型指针。可以用这个迭代器来访问对象的键和值。

m.begin()//
m.end()//这个end()返回的是最后一个元素的下一个地址

可以用这些迭代器来遍历整个map对象:

map<string,int> m;map<string,int>::iterator it;it = m.begin();while(it != m.end())
{it->first;//访问键it->second;//访问值it ++;     //
}

find,find_if

find(find_key):如果找到具有指定键的元素,则为元素的迭代器,否则为map :: end。就是说如果这个map里含有find_key这个键的话就返回它对应的迭代器,否则返回end();这个可以用来判断这个值是否存在于其中。

std::map<string,int> m({{'key1',1},{'key2',2}});if(m.find('key1')==m.end()){std::cout<<"不存在"<<std::endl;
}else{std::cout<<"存在"<<std::endl;
}

find_if:它不是map中的方法,根据指定的pred运算条件(以仿函数表示),循环查找[first,last)内的所有元素,找出第一个令pred运算结果true者。如果找到就返回一个InputIterator指向该元素,否则就返回迭代器last。

#include<map>
#include<iostream>
#include <string>
#include <algorithm> //std::find_if
//map的value_type是std::pair<const Key, t>类型
class map_value_finder
{
public:map_value_finder(const std::string &cmp_string) :m_s_cmp_string(cmp_string) {}bool operator ()(const std::map<int, std::string>::value_type &pair){return pair.second == m_s_cmp_string;}
private:const std::string &m_s_cmp_string;
};int main()
{std::map<int, std::string> my_map;my_map.insert(std::make_pair(10, "china"));my_map.insert(std::make_pair(20, "usa"));my_map.insert(std::make_pair(30, "english"));my_map.insert(std::make_pair(40, "hongkong"));std::map<int, std::string>::iterator it = my_map.end();it = std::find_if(my_map.begin(), my_map.end(), map_value_finder("English"));if (it == my_map.end())printf("not found\n");elseprintf("found key:%d value:%s\n", it->first, it->second.c_str());std::cin.get();return 0;
}

其他

erase:

从地图容器中移除单个元素或一系列元素([first,last))。这有效地减少了容器的大小,删除了被删除的元素数量。该函数返回已擦除的元素数。

  it=m.find('b');m.erase (it);                   // erasing by iteratorm.erase ('c');                  // erasing by keyit=m.find ('e');m.erase ( it, m.end() );    // erasing by range//左闭右开

swap:

交换两个同类型容器的内容,尺寸可以不同。

#include <iostream>
#include <map>int main ()
{std::map<char,int> foo,bar;foo['x']=100;foo['y']=200;bar['a']=11;bar['b']=22;bar['c']=33;foo.swap(bar);std::cout << "foo contains:\n";for (std::map<char,int>::iterator it=foo.begin(); it!=foo.end(); ++it)std::cout << it->first << " => " << it->second << '\n';std::cout << "bar contains:\n";for (std::map<char,int>::iterator it=bar.begin(); it!=bar.end(); ++it)std::cout << it->first << " => " << it->second << '\n';return 0;
}/*输出:
foo contains:
a => 11
b => 22
c => 33
bar contains:
x => 100
y => 200
*/

clear:

删除所有元素,使容器的大小为0。

// map::clear
#include <iostream>
#include <map>int main ()
{std::map<char,int> mymap;mymap['x']=100;mymap['y']=200;mymap['z']=300;std::cout << "mymap contains:\n";for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it)std::cout << it->first << " => " << it->second << '\n';mymap.clear();mymap['a']=1101;mymap['b']=2202;std::cout << "mymap contains:\n";for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it)std::cout << it->first << " => " << it->second << '\n';return 0;
}/*
mymap contains:
x => 100
y => 200
z => 300
mymap contains:
a => 1101
b => 2202*/

count:

计数,但是map中本身key就是唯一的,所以包含这返回1,不包含则返回0。

// map::count
#include <iostream>
#include <map>int main()
{std::map<char, int> mymap;char c;mymap['a'] = 101;mymap['c'] = 202;mymap['f'] = 303;mymap['f'] = 304;for (c = 'a'; c<'h'; c++){std::cout << c<<" 数量: "<<mymap.count(c) << std::endl;}std::cin.get();return 0;
}/*输出:
a 数量: 1
b 数量: 0
c 数量: 1
d 数量: 0
e 数量: 0
f 数量: 1
g 数量: 0
*/

map与unordered_map的区别

map: map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素,因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行这样的操作,故红黑树的效率决定了map的效率。
unordered_map: unordered_map内部实现了一个哈希表,因此其元素的排列顺序是杂乱的,无序的

上面那些方法都是一样的用法。

map和unordered_map的用法和区别相关推荐

  1. STL系列:map和unordered_map

    map和unordered_map的使用 unordered_map的用法和map是一样的,提供了insert,size,count,find等操作,并且里面的元素也是以pair类型来存贮的. 其底层 ...

  2. c++中map、multimap、unordered_map、unordered_multimap的区别

    前言: c++的各种容器使用的时候很方便,但是如果作为一个初学者,看到一堆库要记住也是很头疼的,而且很多库名称会很相似,所以我们要很好的使用这些库的时候,我们需要了解清楚它们底层实现的原理,这样我们使 ...

  3. 原 c++中map与unordered_map的区别

    c++中map与unordered_map的区别 头文件 map: #include < map > unordered_map: #include < unordered_map ...

  4. Collection,List,Set和Map用法和区别

    Collection,List,Set和Map用法和区别 原创 2009年12月22日 17:05:00 标签: list / hashmap / vector / iterator / object ...

  5. set/multiset/unordered_set和map/multimap/unordered_map基础汇总

    引言 在STL中,有两种很常见的关联容器,分别是set和map,序列容器的元素是按照在容器中的位置来顺序保存和访问的,而关联容器的元素是按关键元素来保存和访问的.所以关联容器经常用在关键字的查找中,效 ...

  6. map与unordered_map

    时间复杂度:   map unordered_map Ordering increasing order no  order Implementation Self balancing BST Has ...

  7. C++ set与map、unordered_map、unordered_set与哈希表

    哈希表           表: 存储数据 key –> value; 用表来存储数据结构的困难: 查找困难.一个一个key去比较去查找,效率不高.因此有了Hash算法加快查找; 将字符串的ke ...

  8. 英文写作——The Elements of Style知识点解读1—所有关系—名词所有格‘s和of的用法和区别

    考了很多次六级和托福,每次各项中写作都是最差的一个,但是我可是要成为能发高水平paper的科研人呀,怎么能被英文写作打倒! 我决定时不时来总结一些小小英文知识点,督促自己学习英文. 之前每次都很纠结要 ...

  9. C++ map和unordered_map详解

    C++ map和unordered_map详解 官方文档链接 概述   C++中map和unordered_map提供的是一种键值对容器,在实际开发中会经常用到,它跟Python的字典很类似,所有的数 ...

最新文章

  1. LIVE 预告 | CVPR 2021 预讲 · 迁移学习前沿与进展
  2. java.lang.RuntimeException: Canvas: trying to draw too large(203212800bytes) bitmap.
  3. fs_struct和file_struct关系
  4. 爬取过程中出现验证码_PCBA贴片的过程中为什么出现白点或白斑
  5. 你还在 996 ?提升工作效率请看这几个公众号
  6. 来,看看你的单片机程序有多大!
  7. ElasticSearch 新增节点,横向扩容
  8. rest_framework-00-规范-APIview源码解析-认证
  9. 让电脑清空数据或死机,一定要执行才舒服
  10. 中兴 108 亿换得自由身!
  11. World Leading!世界第二!百度云在吹牛?
  12. 解决genemotion模拟器冲突导致的Android Studio无法启动ADB的问题
  13. mysql 主从 索引_Mysql繁忙主从库在线修改表结构与添加索引问题
  14. torchvision.transforms
  15. js生成带log的二维码(qrcodejs)
  16. 计算机pe教程,win7 winpe安装过程图文教程
  17. mongodb敏感数据加解密
  18. 记ubuntu20.04无线网卡驱动安装
  19. 初中英语知识水平测试软件,美国初中生英文水平测试!百个单词检测,看看你认识几个...
  20. 冰盾ARP防火墙V1.0 Build 80122

热门文章

  1. 【面试题】写一个脚本统计一个文本文件的行数
  2. 极限内卷丨让我们偷偷的卷起来
  3. 手机python软件哪个好_python可以写APP吗(python能做手机软件吗)
  4. 爬取央视网节目单栏目信息!
  5. ftp上传下载文件详解
  6. 东方财富函数(公子咏整理最完整版)
  7. 谷歌浏览器adobe flash player的相关问题
  8. c++ 结构体地址 转换成ulong_一个WinApi Hook程序(下)
  9. 鸿蒙和ios底层,一文解惑,为什么说鸿蒙与iOS、安卓不在一个赛道
  10. C++游戏编程教程(四)