`
kongweile
  • 浏览: 521535 次
  • 性别: 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 

 

分享到:
评论

相关推荐

    STL关联容器概述1

    关联容器主要包括set、multiset、map和multimap四种标准类型,而SGI STL还提供了hash_table和hash_set等非标准关联容器。 关联容器的底层实现通常基于某种平衡二叉搜索树,这种数据结构保证了在插入、查找和删除...

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

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

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

    在C++标准库中,模板被广泛应用于STL(Standard Template Library,标准模板库),其中包括了各种容器如vector、map、multimap、set和multiset。这些容器都是模板类,它们提供了高效的数据组织和操作方式。 1. **...

    SGI STL 关联式容器源码

    在本压缩包中,我们很可能会找到如`set`、`multiset`、`map`和`multimap`等关联式容器的源代码。 关联式容器的核心特性在于它们都是有序的,且通常基于红黑树(Red-Black Tree)的数据结构实现。红黑树是一种自平衡...

    STL常用容器1

    关联式容器是根据元素的关键值进行排序的容器,包括set、map、multiset和multimap。 - **set**:set是唯一元素的集合,元素自动排序。每个元素都有一个键,键是唯一的,不允许重复。 - **map**:map是键值对的...

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

    multimap是STL容器中的一种关联容器,它和map的使用方法相同,但是multimap允许键值重复。multimap的优点是可以快速地查找、插入和删除元素,同时可以保持键值的顺序。 在使用multimap时,需要包含&lt;map&gt;头文件,并...

    c++容器使用经验

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

    Map(STL).rar_C++ map_c++ map_map stl_map容器

    `map`与其他关联容器如`multimap`、`set`和`multiset`之间可以通过成员函数`swap`或拷贝构造函数来进行转换。 **效率分析**: - 插入和查找操作的时间复杂度为O(log n),由于红黑树的特性,操作相对高效。 - 删除...

    C++之STL标准库容器成员一览表.pdf

    本文将对C++ STL标准库容器成员进行概述,包括array、vector、deque、list、forward_list、string、set、multiset、map、multimap、unordered_set、unordered_multiset、unordered_map、unordered_multimap等容器的...

    STL_2 关联容器 String 算法.pdf

    常见的关联容器包括`set`、`multiset`、`map`和`multimap`。 5. **String算法的应用**:字符串算法在C++编程中占有重要地位,STL提供了一系列强大的字符串处理函数,如`find`、`replace`、`compare`等,这些函数极...

    STL.rar_c++ 容器使用

    3. **关联容器(如Set、Map、Multiset、Multimap)**:这些容器中的元素是有序的,并且每个元素都有一个键值。Set和Multiset存储唯一元素,Map和Multimap存储键值对,其中Multiset和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

    STL容器使用代码

    在STL中,容器是一类能够存储数据的对象,包括vector、string、deque、queue、list、set、multiset、map和multimap。下面将详细介绍这些容器的使用和API方法。 1. **vector**:动态数组,可以自动扩展其大小。常用...

    C++STL详解PPT

    顺序容器包括 vector、deque、list 等,关联容器包括 set、multiset、map、multimap 等,容器适配器包括 stack、queue、priority_queue 等。 顺序容器是 STL 中的一种基本容器,用于存放各种类型的数据。顺序容器...

    STL中map、set的数据结构及底层实现.pdf

    STL中的map和set是两种关联容器,它们都基于一种高效的数据结构——红黑树(Red-Black Tree)进行实现。这种数据结构是一种自平衡的二叉查找树,能够保证在最坏情况下的搜索、插入和删除操作的时间复杂度为O(log n)...

    stl容器.zip

    STL容器主要分为四大类:顺序容器、关联容器、容器适配器以及迭代器。接下来我们将详细讨论这些容器及其特点。 1. **顺序容器**: - **vector**:动态数组,可以高效地进行随机访问和尾部插入操作。元素在内存中...

    STL的应用简介

    map 是一种关联容器,可以根据键值快速查找元素。 3. STL 中的迭代器 迭代器是 STL 中的重要组件,提供了遍历容器的接口,而不暴露容器的实现。迭代器可以分为五类:input, output, forward, 双向迭代器和随机迭代...

    STL 应用例子 包括各容器的使用

    - **set/multiset**:红黑树实现的集合,自动排序,不包含重复元素(set)或允许重复元素(multiset)。 - **map/multimap**:红黑树实现的映射,自动排序,键值唯一(map)或键值可以重复(multimap)。 - **...

    STL各种容器详细例子

    根据提供的文件信息,本文将对STL(Standard Template Library)中的几种主要容器进行详细解析,包括`vector`、`deque`、`list`、`set`、`multiset`、`map`、`multimap`、`stack`、`queue`以及`priority_queue`等,...

Global site tag (gtag.js) - Google Analytics