关联容器associative container:被插入的元素并没有一个固定的位置。这不仅是指操作者可能更改其中元素的位置,还有可能——每当新插入一个元素时,容器都会自动的按照某种排序规则将新来的元素放置在合适的位置。也即,这种容器内元素的排列顺序由容器自己的排序规则决定,操作者无能为力。
==============================================================
Set(multiset)
|
|->名称----->set
|->个性
| |------> ①set的底层实现是基于平衡二叉树的(当然标准书中并没有这么规定)
| |------> ②由于关联式容器是顺序的,那么set就不允许对其中的元素作直接的修改,否则所谓的关联容器将不再关联——容器中的元素已经不再符合某种顺序了。
| |------> ③set的排序规则有两种确定方式,一是采用模板参数,一是采用构造参数。前者使得排序规则成为set类型的一部分(在对整个容器作比较等运算的时候,这个是比需的);后者仅在构造一个实例对像的时候用到,但其类型不会改变(虽然排序规则发生了变化),此处的排序规则通常比模板参数中的规则具有更高的优先级。
| |------> ④由于STL基本上采用的是reference语义,故要求其元素必须具备assignable,copyable,comparable。
|
|->陷阱
| |------> ①insert和erase的参数类型不一样的时候其返回的类型也是不一样的。对于set而言,insert(value)会返回一个pair(pos,bool),而insert(pos)则同样返回一个iterator的pos;erase(value)会返回被删除元素的个数,而erase(pos)则不会返回任何东西,它实际上是一个过程式的成员函数。
| |------> ②两个set容器的比较是按照字典的方式进行的。但一定要注意,比较的两个set容器必须要具有相同的类型,特别是在模板参数中给出了排序规则参数的时候,就得注意这些参数是否一致——该参数同样决定着你所用的set的类型。
|
|->说明----->multiset与set的用法基本一样,不同的是它允许出现相同的值得元素。
|
|->Type----->class
|->Include---><set>
|->Define---->set<class T,optional compare,optional>
|->Sub
| |------>constructor
| |->default,copy,assignmet
|->Fun
|------>NoModify operate
| |->.size() .max_size() .empty() (各种compare operator)
|------>seek operator
| |->.count(elem) .find(elem) .lower_bound(elem) .upper_bound(elem)
| .equal_range(elem)
|------>iterator
| |->.begin() .end() .rbegin() .rend()
|------>add&del
|->.insert(elem) .insert(pos,elem) .insert(beg,end)
|->.erase(elem) .erase(pos) .erase(beg,end) .clear()
==============================================================
Map(mulitmap)
|
|->名称----->map
|->个性
| |------> ①map与set的最大区别在于map是一种特殊的set,它的所有元素都是pair<key,value>
| |------> ②map最大的特性在于map提供了下标subscript操作的能力,你可以向数组一样操作map[key]来引用相应的值。这个除了方便以外同样也是问题的根源。
| |------> ③几乎所有针对map的操作都是基于key的。比如,排序就是通过比较key来进行的。
| |------> ④对于set成立的操作在map中基本上都成立
|
|->陷阱
| |------> ①如果你采用了这样的语句erase(pos)——其中的pos是个iterator,那么最好不要在对该pos最任何操作,应为erase(pos)已经将这个pos删除了,此后任何关于pos的操作都视为定义的。这种情况要是发生在for循环中,for(pos=.begin(),pos!=.end(),pos++)就能解决问题了。
| |------> ②假设代码中有这样的语句,cout<<map[key],按理这是没有问题的,但是如果你的key在map中原本是不存在的,那么这句代码会“自作聪明”的帮你在map中将上一个该key的value为default的元素,这恐怕不是件好事。
| |------> ③map[key]=value的操作要比insert(value)的方式慢。
|
|->说明------>multimap的操作与map大致一样,不同在于multimap允许有相同的key在容器中存在。
|
|->Type----->class
|->Include---><map>
|->Define---->map<key,value,optional compare ,optional>
|->Sub
|->Fun
|------>map和set基本具有相同的操作。
|------> 不同的是map的insert(elem)不再返回一个pair而是一个pos的iterator。
分享到:
相关推荐
用AVL-tree数据结构作为底层机制,以STL底层空间配置器和iterator_traits编程技法实作出一个独立的关联式容器(map, set, multimap, multiset),并对外提供接口实现和STL完全兼容的容器。
c++ STL容器使用代码,方便学习 vector string deque queue list set map multiset multimap 容器的API使用方法等
一共四个doc文件,list综合实例、multimap和map的实例、set和multiset的综合实例、vector综合实例
标准STL序列容器:vector、string、deque和list。 标准STL关联容器:set、multiset、map和multimap。
c++ std stl各容器的应用场合及性能 map hash_map unordered_map multimap list forward_list vector set hash_set multiset unsorted_set queue deque priority_queue
本书共分5篇26章,以“C++编程技术→C++ STL泛化技术基础→C++ STL容器技术→C++ STL算法技术→C++ STL迭代器技术”为线索具体展开,通过大量的源码分析和应用实例,详细介绍了C++ STL的技术原理和使用方法。...
关联容器:set,map,multiset,multimap 无序关联容器:unordered_set,unordered_map,unordered_multiset,unordered_multimap 容器均支持列表初始化,重载了相关迭代器的bool类型转换运算符以支持用于条件判断 ...
关联容器 set 快速查找,不允许重复值 multiset 快速查找,允许重复值 map 一对一映射,基于关键字快速查找,不允许重复值 multimap 一对多映射,基于关键字快速查找,允许重复值 容器适配器 stack 后进先出 ...
C++ multimap和map所支持的操作相同(除了multimap不支持下标运算),但是multimap允许重复的元素。 完整程序代码: /*请务必运行以下程序后对照阅读*/ ///头文件依旧是map #include <map> #include #include ...
本实验主要练习容器set、multiset、map、multimap的使用方法,插入迭代器、反向迭代器的用法,以及四种非变异算法的基本用法。 实验器材: VScode 实验内容: 一.回顾以上四种容器相关的例题(不作为实验报告内容)...
STL vector list stack queue deque priority_queue set unordered_set multiset unordered_multiset map multimap unordered_map unordered_multimap algorithm 其它 实现自定义排序规则 Python 攻略 基本数据类型 ...
介绍STL设计原理和使用 STL概览 迭代器 迭代器适配器 容器 序列式容器-vector、list、deque、string 关联式容器-map、set、multimap、multiset 算法和函数对象 函数对象适配器 STL使用注意事项
类似于STL的map、set、multimap和multiset模板,C++ B-tree也提供了btree_map、btree_set、btree_multimap和btree_multiset等模板。 B-tree(多路搜索树,并不是二叉的)是一种常见的数据结构。使用B-tree结构...
第12章 multiset多重集合容器 187 12.1 multiset技术原理 187 12.2 multiset应用基础 190 12.3 本章小结 196 第13章 map映照容器 197 13.1 map技术原理 197 13.2 map应用基础 200 13.3 本章小结 206...
该篇分为十一部分,分别是:vector类的主要成员...stack类的主要成员、queue类的主要成员、priority_queue类的组要成员、set类的主要成员、multiset类的主要成员、map类的主要成员、multimap类的主要成员、STL算法函数
七、map / multimap 映射与多重映射 15 map成员函数: 15 Map实例程序: 17 MultiMap实例程序: 18 八、set / multiset 集合与多重集合 19 成员函数: 19 Set实例程序: 20 MultiSet实例程序: 21 九、deque (Double...
第12章 multiset多重集合容器 187 12.1 multiset技术原理 187 12.2 multiset应用基础 190 12.3 本章小结 196 第13章 map映照容器 197 13.1 map技术原理 197 13.2 map应用基础 200 13.3 本章小结 206...
红黑树是一种很有意思的平衡检索树。...在C++ STL中,很多部分(目前包括set, multiset, map, multimap)应用了红黑树的变体(SGI STL中的红黑树有一些变化,这些修改提供了更好的性能,以及对set操作的支持)。
5.6.2 变动型算法和关联式容器 27 5.6.3 算法vs.成员函数 28 5.7 使用者自定义的泛型函数 29 5.8 以函数作为算法的参数 29 5.8.1 示例for_each和transform 29 5.8.2 判断式(predicates) 30 5.9 仿函数 33 5.9.1 ...
第12章 multiset多重集合容器 187 12.1 multiset技术原理 187 12.2 multiset应用基础 190 12.3 本章小结 196 第13章 map映照容器 197 13.1 map技术原理 197 13.2 map应用基础 200 13.3 本章小结 206...