关联容器中的元素是按关键字来保存和访问的,顺序容器中的元素是按顺序和位置保存和访问的。
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.关联容器操作:
使用作用于运算符来提取一个类型成员,例如: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.访问元素:
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;
如果自定义类已经定义了==操作符,则可以只重载哈希函数。
首先spfa预处理一下K个点以及起终点之间的最小距离。 然后比较显然的状压dp。f[S][i]表示走过了状态为S的点,现在在i的最短路。枚举一个j去转移,判断一下合法就好了。复杂度看上去是O(km+2kk2)O(km+2^kk^2)的。
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
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 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。 MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处...
【狂神说Java】Vue视频2、前端知识体系想要成为真正的“互联网Java全栈工程师”还有很长的一段路要走,其中前端是绕不开的一门必修课。本阶段课程的主要目的就是带领Java后台程序员认识前端、了解前端、掌握前端,为实现成为“互联网Java全栈工程师”再向前迈进一步。2.1、前端三要素HTML(结构):超文本标记语言(Hyper Text Markup Language),决定网页的结构和内容CSS(表现):层叠样式表(Cascading Style Sheets),设定网页的表现样式。Ja
关闭防火墙:systemctlstopfirewalld.service开启防火墙:systemctlstart firewalld.service关闭开机启动:systemctldisablefirewalld.service4开启开机启动:systemctlenable firewalld.service...
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...
1.5G通信系统核心网,接入网,承载网(用于前传,中传,回传)(19’04”开始)3G和4G属于互联网阶段重点是对4G和5G的比较1.2RAN接入网,DN数据中心,上面一块和UPF是核心网,UPF分出来实现控制与用户面分离两种接口结构:下面的N1,N2,N3,N4,N6,N9是基于点对点的接口;上面的是基于服务化的接口...
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
转自:http://www.cnblogs.com/huiyang865/p/5677449.html绘制基本网络图用matplotlib绘制网络图基本流程:1. 导入networkx,matplotlib包2. 建立网络3. 绘制网络 nx.draw()4. 建立布局 pos = nx.spring_layout美化作用最基本画图程序1
1、详细jvm内存模型2、讲讲什么情况下回出现内存溢出,内存泄漏?3、说说Java线程栈4、JVM年轻代到年老代的晋升过程的判断条件是什么呢?5、JVM出现fullGC很频繁,怎么去线上排查问题?6、类加载为什么要使用双亲委派模式,有没有什么场景是打破了这个模式?7、类的实例化顺序8、JVM垃圾回收机制,何时触发MinorGC等操作...