map和unordered_map的用法和区别
用法
定义一个关联容器
需要分别包含头文件
#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的用法和区别相关推荐
- STL系列:map和unordered_map
map和unordered_map的使用 unordered_map的用法和map是一样的,提供了insert,size,count,find等操作,并且里面的元素也是以pair类型来存贮的. 其底层 ...
- c++中map、multimap、unordered_map、unordered_multimap的区别
前言: c++的各种容器使用的时候很方便,但是如果作为一个初学者,看到一堆库要记住也是很头疼的,而且很多库名称会很相似,所以我们要很好的使用这些库的时候,我们需要了解清楚它们底层实现的原理,这样我们使 ...
- 原 c++中map与unordered_map的区别
c++中map与unordered_map的区别 头文件 map: #include < map > unordered_map: #include < unordered_map ...
- Collection,List,Set和Map用法和区别
Collection,List,Set和Map用法和区别 原创 2009年12月22日 17:05:00 标签: list / hashmap / vector / iterator / object ...
- set/multiset/unordered_set和map/multimap/unordered_map基础汇总
引言 在STL中,有两种很常见的关联容器,分别是set和map,序列容器的元素是按照在容器中的位置来顺序保存和访问的,而关联容器的元素是按关键元素来保存和访问的.所以关联容器经常用在关键字的查找中,效 ...
- map与unordered_map
时间复杂度: map unordered_map Ordering increasing order no order Implementation Self balancing BST Has ...
- C++ set与map、unordered_map、unordered_set与哈希表
哈希表 表: 存储数据 key –> value; 用表来存储数据结构的困难: 查找困难.一个一个key去比较去查找,效率不高.因此有了Hash算法加快查找; 将字符串的ke ...
- 英文写作——The Elements of Style知识点解读1—所有关系—名词所有格‘s和of的用法和区别
考了很多次六级和托福,每次各项中写作都是最差的一个,但是我可是要成为能发高水平paper的科研人呀,怎么能被英文写作打倒! 我决定时不时来总结一些小小英文知识点,督促自己学习英文. 之前每次都很纠结要 ...
- C++ map和unordered_map详解
C++ map和unordered_map详解 官方文档链接 概述 C++中map和unordered_map提供的是一种键值对容器,在实际开发中会经常用到,它跟Python的字典很类似,所有的数 ...
最新文章
- LIVE 预告 | CVPR 2021 预讲 · 迁移学习前沿与进展
- java.lang.RuntimeException: Canvas: trying to draw too large(203212800bytes) bitmap.
- fs_struct和file_struct关系
- 爬取过程中出现验证码_PCBA贴片的过程中为什么出现白点或白斑
- 你还在 996 ?提升工作效率请看这几个公众号
- 来,看看你的单片机程序有多大!
- ElasticSearch 新增节点,横向扩容
- rest_framework-00-规范-APIview源码解析-认证
- 让电脑清空数据或死机,一定要执行才舒服
- 中兴 108 亿换得自由身!
- World Leading!世界第二!百度云在吹牛?
- 解决genemotion模拟器冲突导致的Android Studio无法启动ADB的问题
- mysql 主从 索引_Mysql繁忙主从库在线修改表结构与添加索引问题
- torchvision.transforms
- js生成带log的二维码(qrcodejs)
- 计算机pe教程,win7 winpe安装过程图文教程
- mongodb敏感数据加解密
- 记ubuntu20.04无线网卡驱动安装
- 初中英语知识水平测试软件,美国初中生英文水平测试!百个单词检测,看看你认识几个...
- 冰盾ARP防火墙V1.0 Build 80122