文档章节

map和unordered_map

梦想游戏人
 梦想游戏人
发布于 2016/04/06 22:37
字数 500
阅读 223
收藏 1

map 是有序的 内部通常是红黑树实现

unordered_map 是无序的 内部是hash

所以unordered_map  的插入查找删除速度比map快几倍,对数据的顺序没有要求时尽量用unordered_map

Note:

  1. erase的时候 为了保证 迭代器的正确性要么erase(it++); 要么 it=erase(it)

  2. 使用for(const auto &x:mapXX) 遍历的时候 如果循环内存执行了删除插入操作 那么将不会保证结果的正确性

  3. 对于某一个迭代器  之后执行删除插入操作  

unordered_map<int, string> map2;
	map2.insert(pair<int, string>(1, "ARTJSAJSTJ"));
	map2.insert(pair<int, string>(2, "BHWTJUWRTHJSRTJ"));
	map2.insert(make_pair(3, "CHRHEWHEHJT"));
	map2.insert(make_pair(4, "CHRHEWHEHJt"));

	auto it = map2.begin();
	auto itt1 = map2.find(3);

	map2.erase(it);

	cout << (*itt1).second.c_str()<<endl;
	//unorder_map   itt1不会失效
	
	
	
	
	
	
		map<int, string> map1;
		map1.insert(pair<int, string>(1, "ARTJSAJSTJ"));
		map1.insert(pair<int, string>(2, "BHWTJUWRTHJSRTJ"));
		map1.insert(make_pair(3, "CHRHEWHEHJT"));
		map1.insert(make_pair(4, "CHRHEWHEHJt"));

	 
	
	 	auto it1 = map1.begin();
	 
		auto itt = map1.find(3);

		map1.erase(it1);
		cout << (*itt).second.c_str();
		//map 也不失效

删除 插入均不会失效 ,对于这个结论,我比较怀疑,可能是测试用例问题

不过从http://en.cppreference.com/w/cpp/container/map/erase  相关找到了这个疑惑 结论如下:

erase,删除

1.对于unordered_map erase 只对 参数的迭代器会失效,其他迭代器 没影响

原话References and iterators to the erased elements are invalidated. Other iterators and references are not invalidated

2.对于map 一样

原话References and iterators to the erased elements are invalidated. Other references and iterators are not affected.

insert,插入

  1. 对于unorder_map 如果插入导致了 rehashing 那么所有迭代器会失效,否则不会失效。引用不会失效

rehashing只会发生在 插入的新元素 数量 比 max_load_factor()*bucket_count(). 大 

原话If rehashing occurs due to the insertion, all iterators are invalidated. Otherwise iterators are not affected. References are not invalidated. Rehashing occurs only if the new number of elements is higher than max_load_factor()*bucket_count(). 

2.对于map  都不会失效

原话No iterators or references are invalidated.


总结:

插入:unordered_map 可能失效,map不受影响

删除 :被删除的迭代器失效 其他不受影响






© 著作权归作者所有

梦想游戏人
粉丝 38
博文 445
码字总数 127977
作品 0
成都
私信 提问
C++ STL----associative containers

Set: Sets are typically implemented as binary search trees. Therefore, the main characteristics of set as an associative container are: Unique element values: no two elements in......

zhujianbest
2010/06/08
0
0
Cocos2d-x3.0模版容器详解之二:cocos2d::Map

1.概述 版本: v3.0 beta 语言: C++ 定义在 “COCOS2DXROOT/cocos/base” 路径下的 "CCMap.h" 的头文件中。 ? cocos2d::Map<K,V> 是一个内部使用了 std::unorderedmap的关联容器模版。 std::u......

_子墨
2014/08/15
0
0
vector,map 注意事项

1.关于vector的越界访问: 首先以上的代码可以正确编译通过并运行的,不过list[5]是0,在vector中,如果通过[i]下标访问元素,是不会进行越界检查的。所以一般情况不要通过下标来直接访问,建...

lxfeng
2016/04/30
59
0
C++性能系列之map的使用误区

代码逻辑的实现需要键值对的时候我们喜欢偷懒,声明了不少map类型的局部变量,完全没有意识到map的真正用途。map是平衡二叉树,适用于快速检索。由于二叉平衡树插入机制以及内存分配的原因,...

caoshiying
2017/10/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

利用mybatis generator生成实体类、Mapper接口以及对应的XML文件

项目中通常会遇到数据的持久化,如果是采用mybatis的orm,就会涉及到生成xml的问题,刚好mybatis官网提供了这么个插件MyBatis Generator,效果简直是棒呆。 1. 首先需要在build.gradle文件中...

啊哈关关
今天
2
0
SpringSocial相关的知识点

使用SprigSocial开发第三方登录 核心类 ServiceProvider(AbstractOauth2ServiceProvider):主要负责实现server提供商(例如QQ,微信等共有的东西),默认实现类是AbstractOauth2ServiceProvider...

chendom
今天
3
0
Java并发之AQS详解

一、概述   谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!   类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源...

群星纪元
昨天
3
0
Fabric-sdk-java最新教程

Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK的最新精选教程。 如果希望快速掌握F...

汇智网教程
昨天
3
0
react 子组件监听props 变化

componentWillReceiveProps //已经被废弃 getDerivedStateFromProps// 推荐使用//如果条件不存在必须要返回null static getDerivedStateFromProps(props, current_stat...

一箭落旄头
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部