c++ map是有序还是无序的_C++无序关联容器(一)-使用场合和常用函数
碎碎念:
C++11定义了四个无序容器,说是无序,即容器里面的元素关键字无序,因为这些容器不是使用比较运算符来组织元素,而是使用一个哈希函数,和关键字类型的==运算符。
对我们普通人来说,一般考虑的都是它的使用场合和其常用的成员函数,所以我们先来介绍这两个东西。这里拿map举例,set同理。
使用场合:
无序容器支持对单个元素的快速检索,元素在无序容器里面没有被排序,而是依靠他们的哈希值被组织进叫做桶的数据结构中。无序容器比map检索速度快。支持下标访问。
我们知道,map底层是红黑树,查找效率是logn,而无序容器底层是哈希表,查找效率是常数级别。所以,C++primer上说,在关键字类型的元素没有明显的序的情况下,或者在某些应用中,维护元素有序的代价非常高昂,采用无序容器代替map来说效果会好。
常用的函数:
1.使用无序容器必须加头文件: #include
2.初始化:
unordered_map A({ {"123", 1},{"456",4} });//C++11列表初始化
unordered_map B(A);//copy
unordered_map C(A.begin(), A.end());//range
3.更新:
unordered_map A{ {"123", 1},{"456",4} };
unordered_map B{ {"789", 7},{"101112",10} };
3.1 insert()
A.insert(make_pair("123", 5))//插入单个pair
A.insert({ "123", 5 });//插入单个pair
A.insert({{ "123", 5 }, { "456",4 }});//插入多个pair
A.insert(B.begin(),B.end())//插入一个无序容器。
3.2 emplace()添加
unordered_map A{ {"123", 1},{"456",4} };
A.emplace("5",4);
3.3 insert()和emplace()区别
c++11标准引入了emplace(),与insert()相对应。empalce操作构造而不是拷贝元素。
1.当我们调用insert()时,我们将元素类型的对象传递给它们,这些类型被拷贝到容器中。
2.当我们调用emplace(),会在容器管理的内存空间内直接创建对象。
注:
1.emplace()的参数根据元素的类型变化,参数必须与元素类型的构造函数相匹配。
2.insert()和emplace()只有在关键值key在容器中不存在时,才会把该元素插入容器中。
否则如果容器中有关键值为key的元素,则什么也不做。
3.insert和emplace的返回值是一个pair,它的first是一个迭代器,指向具有给定关键字的元素,second是一个bool,指出元素是否插入成功。
4.容量相关
unordered_map A{ {"123", 1},{"456",4} };
A.size() //返回容器的容量
A.empty()//如果容器为空,返回true,否则返回false
A.max_size()//返回最大容量
5.元素访问
5.1 下标访问
unordered_map A{ {"123", 1},{"456",4} };
1. A["789"]=7;
如果key为"789"的元素不存在,则插入一个新的元素到容器。
如果key为"789"的元素存在,则保留它的key,更新它的value。
2. int i=A["101"];
如果key为"101"的元素不存在,则返回其对应类型的初始值,int为0。
如果key为"101"的元素存在,则返回其value。
5.2 at访问
unordered_map A{ {"123", 1},{"456",4} };
1.A.at("123")=5;
如果key为"123"的元素存在,则更新其value。如果不存在,抛出一个异常。
http://2.int i=A.at("123");
如果key为"123"的元素存在,则返回其value,如果不存在,则抛出一个异常。
5.3 下标访问和at访问的区别:
at访问时,如果元素的key值不存在,会抛出异常,
下标访问如果元素的key值不存在,则添加一个关键之为key的元素,并对其进行值初始化。
6.查找元素
unordered_map A{ {"123", 1},{"456",4} };
1.A.find("123");
如果找到了key为123的元素,则返回其对应的迭代器,如果没找到,则返回A.end();
常用的用法为if(A.find("123")!=A.end()){}//如果找到了。
2.A.count("123");
如果容器中有key为123的元素,则返回其个数,在map中也就是1,不存在返回0;
7.删除元素。
unordered_map A{ {"123", 1},{"456",4} };
1.A.erase("123");//从A中删除每个关键字为"123"的元素。返回删除元素的个数。
2.auto w=A.find("123"); A.erase(w)//从A中删除迭代器w指向的元素。返回w之后元素的迭代器。
8.清空容器
unordered_map A{ {"123", 1},{"456",4} };
A.clear();//所有的元素从容器中移除,并且调用他们的构造函数,容器的大小变为0.
9.关于桶的函数:
unordered_map A{ {"123", 1},{"456",4} };
9.1桶的接口
1. A.bucket_count(); //返回正在使用的桶的数目
2. A.max_bucket_count()//容器能容纳的最多的桶的数目
3. A.bucket_size(n) //第n个桶中有多少元素
4. A.bucket(k) //关键字为K的元素在第几个桶中,返回的是int。
9.2哈希策略
1. A.load_factor() //返回每个桶的平均元素数量 float值。 A.size()/A.bucket_count()
2. A.rehash(n)//重组存储,使得桶的数量大于n
3. A.reserve(n)//通过设置预期容器的大小,使得我们不必因为元素的增加多次重组存储。
9.3桶迭代
1. A.begin(n),A.end(n)//返回桶n的首元素迭代器和尾后迭代器。
举例:依次输出每个桶中的元素:
int main()
{
std::unordered_map<:string std::string> mymap;
mymap = { { "Australia","Canberra" },{ "U.S.","Washington" },{ "France","Paris" } };
std::cout << "mymap contains:";
for (auto it = mymap.begin(); it != mymap.end(); ++it)
std::cout << " " << it->first << ":" << it->second;
std::cout << std::endl;
std::cout << "mymap's buckets contain:\n";
for (unsigned i = 0; i < mymap.bucket_count(); ++i)
{
std::cout << "bucket #" << i << " contains:";
for (auto local_it = mymap.begin(i); local_it != mymap.end(i); ++local_it)
{
std::cout << " " << local_it->first << ":" << local_it->second;
}
std::cout << std::endl;
}
system("pause");
return 0;
}
c++ map是有序还是无序的_C++无序关联容器(一)-使用场合和常用函数相关推荐
- C++primer第十一章 关联容器 11.3关联容器操作 11.4 无序容器
11.3关联容器操作 除了表9.2(第295页)中列出的类型,关联容器还定义了表11.3中列出的类型.这些类型表示容器关键字和值的类型. 对于set类型,key_type和value type是一样的 ...
- C++ 无序关联容器
C++ 11标准当中新增加了四个无序关联容器,分别是 unordered_map 映射 unordered_multimap 多重映射 unordered_set 集合 unordered_multi ...
- c++ map是有序还是无序的_C++ STL中Map的按Key排序和按Value排序
map是用来存放键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择. 我们这样定义 ...
- Map的有序和无序实现类,与Map的排序
Map的有序和无序实现类,与Map的排序 1.HashMap.Hashtable不是有序的: 2.TreeMap和LinkedHashMap是有序的(TreeMap默认 Key 升序,LinkedHa ...
- c++ map是有序还是无序的_go 学习笔记之数组还是切片都没什么不一样
上篇文章中详细介绍了 Go 的基础语言,指出了 Go 和其他主流的编程语言的差异性,比较侧重于语法细节,相信只要稍加记忆就能轻松从已有的编程语言切换到 Go 语言的编程习惯中,尽管这种切换可能并不是特 ...
- C++知识点33——使用C++标准库(无序关联容器unordered_(multi)map,unordered_(multi)set)
C++中,无序关联容器一共有4个,unordered_map,unordered_set,unordered_multimap,unordered_multiset 这四个和有序关联容器最大的区别就是 ...
- Java中List Set Map 是否有序等总结
1.Collection List Set Map 区别记忆 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文 ...
- C++|STL学习笔记-对STL中关联容器map的进一步认识
关联容器map key + value 的值 关联容器 = 有序容器(红黑树) + 无序容器(散列表) + hash_map 有序容器中: map的键值是不允许重复的 multimap的键值是允许重复 ...
- 关联容器----关联容器概述,关联容器操作,无序容器
关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的.与之相对,顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的. 关联容器支持高效的关键字查找和访问.两个主要的关联容器 ...
- C++ 11 特性:关联容器map、set的使用
参考文献<C++ Primer> 一.关联容器概述 1.1 关联容器的概念 关联容器支持高效的查找与访问,主要的关联容器为map与set这两个.其中map主要提供的是键-值的操作,比如字典 ...
最新文章
- 安全漏洞“心脏出血”继续 原因是“丘比特”
- LeetCode Maximum Product Subarray(最大子数组乘积)
- ubuntu16安装最新protocbuf 和 protoc-gen-go
- 企业有了程序员为什么还要用 低代码/无代码
- 【转】基于DCMTK的DICOM相关程序编写攻略
- 金蝶kis云+sqlserver报表分析
- 从零开始学前端:函数 --- 今天你学习了吗?(JS:Day8)
- python generator object_python - 将生成器对象转换为列表以进行调试
- win11桌面图标模糊怎么办 windows11桌面图标模糊的解决方法
- linux安装rz sz命令不能用,Linux下如何安装rz和sz命令
- 360黑客攻防技术分享会
- iphone换android手机铃声,为什么大多数苹果手机用户只使用默认铃声,从不更换?原因很现实...
- 互联网赚钱:一个抖音小项目,分析下,人人都能做
- html td 跨两个,【单选题】在HTML中,td标签的( )属性用于创建跨多个行的单元格。...
- google浏览器设置不缓存
- ERROR: Error while obtaining start requests
- 【每周CV论文推荐】初学基于GAN的三维图像生成有哪些经典论文需要阅读
- 微信小程序——卡片列表显示listview(带阴影)
- Unity Steam_VR开发工具插件---VRTK 自带案例分析
- STM32启动文件学习总结
热门文章
- Android已有的原生Camera框架中加入自己的API的实现方案。
- spark sql 对接 HDFS
- Ubuntu 中搭建 LAMP 及 php 开发工具
- java垃圾收集器、Serial收集器、ParNew收集器、Parallel Scavenge收集器、Serial Old 收集器、CMS收集器、G1收集器、如何查看GC日志
- Spring Cloud Alibaba Sentinel之服务熔断篇
- 并发编程学习之原子变量类
- springboot实现数据库读写分离的一款框架
- Spring整合MyBatis原理之MapperScannerConfigurer(一)
- RocketMQ之消费者顺序消费源码解析
- 数字劳工与下一代互联网