关联容器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...
常用的容器有vector、deque、list、map/multimap、set/multiset等。每种容器都有其特点和使用场景,例如vector适合频繁的插入和删除操作,而list适合频繁的遍历操作。 二、迭代器(Iterator) 迭代器是STL中的另一...
红黑树是一种很有意思的平衡检索树。...在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 ...