碎碎念:

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++无序关联容器(一)-使用场合和常用函数相关推荐

  1. C++primer第十一章 关联容器 11.3关联容器操作 11.4 无序容器

    11.3关联容器操作 除了表9.2(第295页)中列出的类型,关联容器还定义了表11.3中列出的类型.这些类型表示容器关键字和值的类型. 对于set类型,key_type和value type是一样的 ...

  2. C++ 无序关联容器

    C++ 11标准当中新增加了四个无序关联容器,分别是 unordered_map 映射 unordered_multimap 多重映射 unordered_set 集合 unordered_multi ...

  3. c++ map是有序还是无序的_C++ STL中Map的按Key排序和按Value排序

    map是用来存放键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择. 我们这样定义 ...

  4. Map的有序和无序实现类,与Map的排序

    Map的有序和无序实现类,与Map的排序 1.HashMap.Hashtable不是有序的: 2.TreeMap和LinkedHashMap是有序的(TreeMap默认 Key 升序,LinkedHa ...

  5. c++ map是有序还是无序的_go 学习笔记之数组还是切片都没什么不一样

    上篇文章中详细介绍了 Go 的基础语言,指出了 Go 和其他主流的编程语言的差异性,比较侧重于语法细节,相信只要稍加记忆就能轻松从已有的编程语言切换到 Go 语言的编程习惯中,尽管这种切换可能并不是特 ...

  6. C++知识点33——使用C++标准库(无序关联容器unordered_(multi)map,unordered_(multi)set)

    C++中,无序关联容器一共有4个,unordered_map,unordered_set,unordered_multimap,unordered_multiset 这四个和有序关联容器最大的区别就是 ...

  7. Java中List Set Map 是否有序等总结

    1.Collection List Set Map 区别记忆 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文 ...

  8. C++|STL学习笔记-对STL中关联容器map的进一步认识

    关联容器map key + value 的值 关联容器 = 有序容器(红黑树) + 无序容器(散列表) + hash_map 有序容器中: map的键值是不允许重复的 multimap的键值是允许重复 ...

  9. 关联容器----关联容器概述,关联容器操作,无序容器

    关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的.与之相对,顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的. 关联容器支持高效的关键字查找和访问.两个主要的关联容器 ...

  10. C++ 11 特性:关联容器map、set的使用

    参考文献<C++ Primer> 一.关联容器概述 1.1 关联容器的概念 关联容器支持高效的查找与访问,主要的关联容器为map与set这两个.其中map主要提供的是键-值的操作,比如字典 ...

最新文章

  1. 安全漏洞“心脏出血”继续 原因是“丘比特”
  2. LeetCode Maximum Product Subarray(最大子数组乘积)
  3. ubuntu16安装最新protocbuf 和 protoc-gen-go
  4. 企业有了程序员为什么还要用 低代码/无代码
  5. 【转】基于DCMTK的DICOM相关程序编写攻略
  6. 金蝶kis云+sqlserver报表分析
  7. 从零开始学前端:函数 --- 今天你学习了吗?(JS:Day8)
  8. python generator object_python - 将生成器对象转换为列表以进行调试
  9. win11桌面图标模糊怎么办 windows11桌面图标模糊的解决方法
  10. linux安装rz sz命令不能用,Linux下如何安装rz和sz命令
  11. 360黑客攻防技术分享会
  12. iphone换android手机铃声,为什么大多数苹果手机用户只使用默认铃声,从不更换?原因很现实...
  13. 互联网赚钱:一个抖音小项目,分析下,人人都能做
  14. html td 跨两个,【单选题】在HTML中,td标签的( )属性用于创建跨多个行的单元格。...
  15. google浏览器设置不缓存
  16. ERROR: Error while obtaining start requests
  17. 【每周CV论文推荐】初学基于GAN的三维图像生成有哪些经典论文需要阅读
  18. 微信小程序——卡片列表显示listview(带阴影)
  19. Unity Steam_VR开发工具插件---VRTK 自带案例分析
  20. STM32启动文件学习总结

热门文章

  1. Android已有的原生Camera框架中加入自己的API的实现方案。
  2. spark sql 对接 HDFS
  3. Ubuntu 中搭建 LAMP 及 php 开发工具
  4. java垃圾收集器、Serial收集器、ParNew收集器、Parallel Scavenge收集器、Serial Old 收集器、CMS收集器、G1收集器、如何查看GC日志
  5. Spring Cloud Alibaba Sentinel之服务熔断篇
  6. 并发编程学习之原子变量类
  7. springboot实现数据库读写分离的一款框架
  8. Spring整合MyBatis原理之MapperScannerConfigurer(一)
  9. RocketMQ之消费者顺序消费源码解析
  10. 数字劳工与下一代互联网