[读书笔记] C++Primer (第5版) 第11章 关联容器_c++ paur类型_Jamuterbo的博客-程序员秘密

技术标签: C++  c++  

关联容器中的元素是按关键字来保存和访问的,顺序容器中的元素是按顺序和位置保存和访问的。

1.关联容器概述:

   map和set是两种主要的关联容器。

   map中的元素是一些关联字-值,set中每个元素质包含一个关键字。    

按关键字有序保存元素
map 关联数组,保存关键字-值对
set 只保存关联字的容器
multimap 关键字可重复出现的map
multiset 关键字可重复出现的set
无序集合
unordered_map 用哈希函数组织的map
unordered_set 用哈希函数组织的set
unordered_multimap 哈希组织的map,关键字可重复出现
unordered_multiset 哈希组织的set,关键字可重复出现

   关联容器的迭代器都是双向的。

   set的元素类型就是关键字,map的元素类型是pair类型的对象。

   一个map和set中关键字必须是唯一的。但是对于加multi前缀的,允许多个元素具有相同的关键字。

2.pair类型:

   map的元素是pair:pair的数据成员是public的,两个成员分别命名为first(关键字)和second(对应值)。

   pair<string, int>  word_count;            // 保存一个string和一个int

   可以使用make_pair(v1, v2) 返回一个用v1和v2初始化的pair。

3.关键字类型的要求:

   对于有序容器,关键字类型必须定义元素比较的方法。

   可以向一个算法提供我们自己定义的比较操作,所提供的操作必须在关键字类型上定义一个严格弱序(可看作“小于等于”)。

   为了指定使用自定义的操作,必须在定义关联容器类型时提供此操作的类型。

   bool CompareIsbn(const Sale_data &lhs, const Sale_data &rhs){

       return lhs.isdn() < rhs.isdn();

   }

   multiset<Sale_data, decltypr(CompareIsdn)*>    set;                 // 必须加上一个*,来指出要使用一个给定函数类型的指针

4.关联容器操作:

  • key_type:关键字类型
  • mapped_type:关键字关联的类型,只适用于map
  • value_type:元素的值得类型,map是paur类型。

   使用作用于运算符来提取一个类型成员,例如:map<string, int>::key_value;

   当解引用一个关联容器的迭代器时,会得到一个类型为容器的value_type的值得引用。

   map和set的关键字是const的,所以不能修改。只能修改map的关联值。

   迭代器是按照关键字升序遍历元素的。

   通常不对关联容器使用算法,可用于只读算法。但使用关联容器专用的find会比调用泛型find快得多。

   关联容器使用算法的话,要么作为源序列,要么作为目的位置。

5.添加元素:

   map和set插入一个已存在元素,对容器没有影响。

   set1.insert(ivec.cbegin(), ivec.cend());            // 还可以使用初始化列表{}插入

   向map中插入元素,要先创建一个pair。

   返回值:添加单一元素的insert和emplace返回一个pair。

   ret.first:一个map迭代器,指向具有给定关键字的元素。ret.first->first 插入的关键字。

   ret.second:一个bool值,插入成功为TRUE,已存在与列表中为FALSE。multi关联容器无需返回bool值,因为可以重复,所以总是向容器中插入。

6.删除元素:

   关联容器可根据key_value删除元素。erase(key_value);

7.下标操作:

   set没有下标操作。multi也没有下标操作,因为可以有相同的关键字。map和unordered_map可以使用at()。

   可以使用[]的下标操作,如果该关键字不在map中,会为它创建一个元素插入到容器中。

   由于下标操作可能插入元素,所以只能对非const的map使用。

   顺序容器的解引用一个迭代器和下标访问的返回值是一样的,但是map的下标访问返回mapped_type(关联的值),解引用返回的是value_type(pair类型);

8.访问元素:

  • count(key) :返回这个关键字出现的次数。
  • upper_bound(key):返回一个迭代器,指向第一个关键字大于k的元素(不适用无序)
  • lower_bound(key):返回一个迭代器,指向第一个关键字不小于k的元素(不适用无序)
  • equal_range(k):返回一个pair,两个成员为迭代器,表示关键字为k的范围,没找到的话,都是尾后迭代器。

9.无序容器:

   使用哈希函数和==运算符来组织元素(有序使用<)。

   维护元素序列的代价通常很高,不需要排序时可使用无序容器

   也可使用find和insert。

   管理桶:无序容器在存储组织为一组桶,每个桶保存零个或多个元素,使用哈希函数将元素映射到桶。

   为访问一个元素,容器先计算元素的哈希值,它指出应该搜索哪个桶。

   容器将具有同一个哈希值的元素都存放在一个桶中(不同元素也可能映射到一个桶)。如果是multi的容器,相同的关键字元素也会在一个桶中。

   无序容器的性能依赖于哈希函数的质量和桶的数量和大小。

   使用一个hash<key_value>类型的对象来生成每个元素的哈希值。

   关键字需要有hash模板。标准库为内置类型,string和智能指针提供了hash模板。自定义类型的无序容器,不能直接使用哈希模板,必须提供我们自己的hash模板版本。

   size_t hasher(const Sale_data &sd){

       return hash<string>()(sd.isdn());     // 通过isdn的hash模板来达到Sale_data的模板

   }

   bool eqOp(const Sale_data &l, const Sale_data &r){  return l.isdn() == r.isdn();   }

   unordered_multiset<Sale_data, decltyle(hasher)*, decltype(eqOp)*>  setBook;

   如果自定义类已经定义了==操作符,则可以只重载哈希函数。

 

   

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Jamuterbo/article/details/106446109

智能推荐

bzoj1097 [POI2007]旅游景点atr(spfa+状压dp)_Icefox_zhx的博客-程序员秘密

首先spfa预处理一下K个点以及起终点之间的最小距离。 然后比较显然的状压dp。f[S][i]表示走过了状态为S的点,现在在i的最短路。枚举一个j去转移,判断一下合法就好了。复杂度看上去是O(km+2kk2)O(km+2^kk^2)的。

Fourier Transform_fanbird2008的博客-程序员秘密

The Fourier transform is a generalization of the complex Fourier series in the limit asinfty" src="http://mathworld.wolfram.com/images/equations/FourierTransform/Inline1.gif" width="38" height="14

[转] Implementation of Fast Fourier Transform for Image Processing in DirectX 10_weixin_30273175的博客-程序员秘密

Download Sample CodeFFTDX10.zip[ZIP | 6.36MB]IntroductionThe Discrete Fourier Transform (DFT) is a specific form of Fourier analysis to convert one function (often in the time or spatial doma...

mybatis框架_XCXCode的博客-程序员秘密

一、什么是MyBatis  MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。  MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处...

Vue学习笔记 01前端知识体系_answero的博客-程序员秘密

【狂神说Java】Vue视频2、前端知识体系想要成为真正的“互联网Java全栈工程师”还有很长的一段路要走,其中前端是绕不开的一门必修课。本阶段课程的主要目的就是带领Java后台程序员认识前端、了解前端、掌握前端,为实现成为“互联网Java全栈工程师”再向前迈进一步。2.1、前端三要素HTML(结构):超文本标记语言(Hyper Text Markup Language),决定网页的结构和内容CSS(表现):层叠样式表(Cascading Style Sheets),设定网页的表现样式。Ja

随便推点

CentOS 7.2 关闭防火墙_centos7图形界面关闭防火墙_香草天空Sky的博客-程序员秘密

关闭防火墙:systemctlstopfirewalld.service开启防火墙:systemctlstart firewalld.service关闭开机启动:systemctldisablefirewalld.service4开启开机启动:systemctlenable firewalld.service...

python带通滤波_python中的fft带通滤波器(fft bandpass filter in python)_weixin_39645306的博客-程序员秘密

python中的fft带通滤波器(fft bandpass filter in python)我尝试的是用fft过滤我的数据。 我有一个以500Hz记录的嘈杂信号作为1d阵列。 我的高频应该以20Hz的频率切断,我的低频以10Hz的频率切断。 我试过的是:fft=scipy.fft(signal)bp=fft[:]for i in range(len(bp)):if not 10bp[i]=0ib...

5G网络技术_5g接口_Yummyyyyh的博客-程序员秘密

1.5G通信系统核心网,接入网,承载网(用于前传,中传,回传)(19’04”开始)3G和4G属于互联网阶段重点是对4G和5G的比较1.2RAN接入网,DN数据中心,上面一块和UPF是核心网,UPF分出来实现控制与用户面分离两种接口结构:下面的N1,N2,N3,N4,N6,N9是基于点对点的接口;上面的是基于服务化的接口...

cuFFT_算法学习者的博客-程序员秘密

cuFFT1. IntroductionThis document describes cuFFT, the NVIDIA CUDA Fast Fourier Transform (FFT) product. It consists of two separate libraries: cuFFT and cuFFTW. The cuFFT library is d

python networkx 绘制网络图简介_H-Fighting的博客-程序员秘密

转自:http://www.cnblogs.com/huiyang865/p/5677449.html绘制基本网络图用matplotlib绘制网络图基本流程:1. 导入networkx,matplotlib包2. 建立网络3. 绘制网络 nx.draw()4. 建立布局 pos = nx.spring_layout美化作用最基本画图程序1

面试-jvm_afqm8611的博客-程序员秘密

1、详细jvm内存模型2、讲讲什么情况下回出现内存溢出,内存泄漏?3、说说Java线程栈4、JVM年轻代到年老代的晋升过程的判断条件是什么呢?5、JVM出现fullGC很频繁,怎么去线上排查问题?6、类加载为什么要使用双亲委派模式,有没有什么场景是打破了这个模式?7、类的实例化顺序8、JVM垃圾回收机制,何时触发MinorGC等操作...

推荐文章

热门文章

相关标签