STL概览-关联容器set,multiset,map,multimap
2008-12-12 10:33
573 查看
关联式容器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。
==============================================================
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。
相关文章推荐
- STL概览-关联容器set,multiset,map,multimap(四)
- STL关联容器MAP、SET与multimap、multiset与hashmap、hashset的区别
- STL之关联容器(set /map /multiset /multimap)
- STL之关联容器(set /map /multiset /multimap)
- STL 笔记(二) 关联容器 map、set、multimap 和 multimap
- 关联容器(map、set、multimap、multiset、pair、unordered_map)
- STL 笔记(二) 关联容器 map、set、multimap 和 multimap常用函数
- 关联容器(set & multiset & Map& multimap)
- STL有4种联合容器(set,multiset, map, multimap)
- STL 笔记(二) 关联容器 map、set、multimap 和 multimap
- STL之红黑树容器:set,hash_set,multiset,hash_map,multimap
- 今日学习札记——STL常用容器:vector、list、set和multiset、map和multimap(11.17)
- C++:关联容器(set,multiset,map,multimap)
- 16 STL集合和映射容器set/multiset_map/multimap
- 【第10章 关联容器】hashtable, hash_map, hash_set, hash_multiset, hash_multimap基于hashtable
- 实例讲解,set,multiset,map,multimap关联容器
- STL容器 set、 multiset、map、multimap
- 关联容器 map/set/multimap/multiset
- C++的STL容器之关联性容器set、multiset、map、multimap
- STL容器:set/map/multiset/multimap 与hash_set/hash_map/hash_multiset/hash_multimap