`
kongweile
  • 浏览: 506765 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

STL关联容器set,multiset,map,multimap

 
阅读更多

 

关联容器associative container:被插入的元素并没有一个固定的位置。这不仅是指操作者可能更改其中元素的位置,还有可能——每当新插入一个元素时,容器都会自动的按照某种排序规则将新来的元素放置在合适的位置。也即,这种容器内元素的排列顺序由容器自己的排序规则决定,操作者无能为力。

 

==============================================================

Set(multiset)

|

|->名称----->set

|->个性

|      |------> set的底层实现是基于平衡二叉树的(当然标准书中并没有这么规定)

|      |------> 由于关联式容器是顺序的,那么set就不允许对其中的元素作直接的修改,否则所谓的关联容器将不再关联——容器中的元素已经不再符合某种顺序了。

|      |------> set的排序规则有两种确定方式,一是采用模板参数,一是采用构造参数。前者使得排序规则成为set类型的一部分(在对整个容器作比较等运算的时候,这个是比需的);后者仅在构造一个实例对像的时候用到,但其类型不会改变(虽然排序规则发生了变化),此处的排序规则通常比模板参数中的规则具有更高的优先级。

|      |------> 由于STL基本上采用的是reference语义,故要求其元素必须具备assignable,copyable,comparable

|

|->陷阱

|      |------> inserterase的参数类型不一样的时候其返回的类型也是不一样的。对于set而言,insert(value)会返回一个pair(pos,bool),而insert(pos)则同样返回一个iteratorposerase(value)会返回被删除元素的个数,而erase(pos)则不会返回任何东西,它实际上是一个过程式的成员函数。

|      |------> 两个set容器的比较是按照字典的方式进行的。但一定要注意,比较的两个set容器必须要具有相同的类型,特别是在模板参数中给出了排序规则参数的时候,就得注意这些参数是否一致——该参数同样决定着你所用的set的类型。

|

|->说明----->multisetset的用法基本一样,不同的是它允许出现相同的值得元素。

|

|->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

|->个性

|      |------> mapset的最大区别在于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],按理这是没有问题的,但是如果你的keymap中原本是不存在的,那么这句代码会“自作聪明”的帮你在map中将上一个该keyvaluedefault的元素,这恐怕不是件好事。

|      |------> map[key]=value的操作要比insert(value)的方式慢。

|

|->说明------>multimap的操作与map大致一样,不同在于multimap允许有相同的key在容器中存在。

|

|->Type----->class

|->Include---><map>

|->Define---->map<key,value,optional compare ,optional>

|->Sub

|->Fun

       |------>mapset基本具有相同的操作。

       |------> 不同的是mapinsert(elem)不再返回一个pair而是一个pos的iterator 

 

分享到:
评论

相关推荐

    AVL_Tree实现STL中的map, set, multimap和multiset

    用AVL-tree数据结构作为底层机制,以STL底层空间配置器和iterator_traits编程技法实作出一个独立的关联式容器(map, set, multimap, multiset),并对外提供接口实现和STL完全兼容的容器。

    STL容器使用代码

    c++ STL容器使用代码,方便学习 vector string deque queue list set map multiset multimap 容器的API使用方法等

    C++模板(vector、map、multimap、set、multiset)

    一共四个doc文件,list综合实例、multimap和map的实例、set和multiset的综合实例、vector综合实例

    c++容器使用经验

    标准STL序列容器:vector、string、deque和list。 标准STL关联容器:set、multiset、map和multimap。

    细讲c++ 各种STL容器的应用场合及性能

    c++ std stl各容器的应用场合及性能 map hash_map unordered_map multimap list forward_list vector set hash_set multiset unsorted_set queue deque priority_queue

    C++ STL 开发技术导引(随书源码)

    本书共分5篇26章,以“C++编程技术→C++ STL泛化技术基础→C++ STL容器技术→C++ STL算法技术→C++ STL迭代器技术”为线索具体展开,通过大量的源码分析和应用实例,详细介绍了C++ STL的技术原理和使用方法。...

    MyStl:自己实现STL

    关联容器:set,map,multiset,multimap 无序关联容器:unordered_set,unordered_map,unordered_multiset,unordered_multimap 容器均支持列表初始化,重载了相关迭代器的bool类型转换运算符以支持用于条件判断 ...

    C++容器类的简单介绍.doc

    关联容器 set 快速查找,不允许重复值 multiset 快速查找,允许重复值 map 一对一映射,基于关键字快速查找,不允许重复值 multimap 一对多映射,基于关键字快速查找,允许重复值 容器适配器 stack 后进先出 ...

    C++ STL入门教程(7) multimap、multiset的使用

    C++ multimap和map所支持的操作相同(除了multimap不支持下标运算),但是multimap允许重复的元素。 完整程序代码: /*请务必运行以下程序后对照阅读*/ ///头文件依旧是map #include &lt;map&gt; #include #include ...

    C++STL实验报告-迭代器和非变异算法

    本实验主要练习容器set、multiset、map、multimap的使用方法,插入迭代器、反向迭代器的用法,以及四种非变异算法的基本用法。 实验器材: VScode 实验内容: 一.回顾以上四种容器相关的例题(不作为实验报告内容)...

    go-web:后端开发指南(笔记)

    STL vector list stack queue deque priority_queue set unordered_set multiset unordered_multiset map multimap unordered_map unordered_multimap algorithm 其它 实现自定义排序规则 Python 攻略 基本数据类型 ...

    STL设计原理和使用

    介绍STL设计原理和使用 STL概览 迭代器 迭代器适配器 容器 序列式容器-vector、list、deque、string 关联式容器-map、set、multimap、multiset 算法和函数对象 函数对象适配器 STL使用注意事项

    谷歌 B-Tree C++ 模板库.

    类似于STL的map、set、multimap和multiset模板,C++ B-tree也提供了btree_map、btree_set、btree_multimap和btree_multiset等模板。 B-tree(多路搜索树,并不是二叉的)是一种常见的数据结构。使用B-tree结构...

    C++ STL开发技术导引(第5章)

    第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...

    STL容器 算法 函数表

    该篇分为十一部分,分别是:vector类的主要成员...stack类的主要成员、queue类的主要成员、priority_queue类的组要成员、set类的主要成员、multiset类的主要成员、map类的主要成员、multimap类的主要成员、STL算法函数

    stl详解 包括各种实例代码

    七、map / multimap 映射与多重映射 15 map成员函数: 15 Map实例程序: 17 MultiMap实例程序: 18 八、set / multiset 集合与多重集合 19 成员函数: 19 Set实例程序: 20 MultiSet实例程序: 21 九、deque (Double...

    C++ STL 开发技术导引(第6章)

    第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操作的支持)。

    C++标准程序库STL的架构

    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 ...

    C++ STL开发技术导引(第3章)

    第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...

Global site tag (gtag.js) - Google Analytics