met和set的特性及区别

发布于:2024-06-28 ⋅ 阅读:(137) ⋅ 点赞:(0)

1、关联式容器

在c++初阶阶段,我们已经接触了STL的部分容器,比如:vector,list,deque,forward_list等。

这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的就是数据本身。

而关联式容器同样也是用来存储数据的容器,但与序列式容器不同的是,里面存储的<key,value>结构的键值对,在数据检索的时候比序列式容器的效率更高。

2、键值对

键值对用来表示具有一一对应关系的一种结构,该结构中一般包含两个成员变量key和value,key表示键值,value表示与key对应的信息,比如:现在需要建立一个英汉互译的字典,那该字典中必然有英文单词和其中文的含义,而且英文单词与其中文含义是一一对应的关系,通过英文单词就可以找到其中文含义。

3、树形结构的关联式容器

根据应用场景的不同,STL总共实现了两种不同结构的管理式容器:树形结构和哈希结构。树形结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点式:使用平衡二叉树(红黑树)作为其底层结果,容器中的元素是 一个有序的序列。

3.1set

3.1.1set的介绍

set是继承自collection的一个接口类,并且要求key一定唯一,set的底层是使用map来实现的,set的最大功能是对集合中的元素进行了去重,实现set接口类有树形Treeset和哈希性Hashset,set中的key不能修改,如果要修改,必须将原来的删掉,然后再重新插入修改后的值。

定义: 

  1. set是按照一定次序存储元素的容器
  2. set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。 set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
  3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
  4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。
  5. set在底层是用二叉搜索树(红黑树)实现的。

NOTICE !!!

1、与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>set中只放 value,但在底层实际存放的是由<value, value>构成的键值对。

  1. set中插入元素时,只需要插入value即可,不需要构造键值对。
  2. set中的元素不可以重复(因此可以使用set进行去重)
  3. 使用set的迭代器遍历set中的元素,可以得到有序序列
  4. set中的元素默认按照小于来比较
  5. set中查找某个元素,时间复杂度为:$log_2 n$
  6. set中的元素不允许修改(为什么?)

set中的底层使用二叉搜索树(红黑树)来实现

3.1.2set的使用 

set的初始化

empty (1)
explicit set (const key_compare& comp = key_compare(),
              const allocator_type& alloc = allocator_type());
range (2)
template <class InputIterator>
  set (InputIterator first, InputIterator last,
       const key_compare& comp = key_compare(),
       const allocator_type& alloc = allocator_type());
copy (3)
set (const set& x)
1、set 的模板参数列表

T:set存放元素的类型,在底层中存储的实际上是<value,value>的键值对。

Compare:set中元素默认按照小于来比较。

Alloc:set中元素空间管理的方式,使用STL提供的空间配置器来管理

2、set的迭代器

 3.set的容量

1)、bool empty() const      检查set是否为空,空则返回true,否则返回true

2)、size_t size()  const    返回set中有效元素的个数

4、set的修改操作

 5、set使用案列

 3.2.map

3.2map
3.2.1map的介绍

map是一个接口类,该类没有继承自collection类,不能直接实例化对象,如果要实例化对象只能实例化 其实现类TreeMaphe或者HashMap,该类中存储的是<key,value>结构的键值对,并且k一定是唯一的,不能重复。且Map中键值对的key不能修改,value可以修改,如果要修改key,只能将key删除掉,然后再来进行重新插入。

 1、模板参数说明

key:键值中key的leixing

T:键值中value 的类型

compare:比较器的类型,在缺省的情况下,按照小于比较。

Alloc:空间配置器,用来配置空间,不需要用户传递吗,除非用户不想使用标准库提供的空间配置器。

2、迭代器的类型

参见cplusplus官网定义

1、map是关联式容器,他按照特定的次序存储由键值key和值value组合而成的元素。

2、在map中,键值key通常用于排序个唯一地标识元素,而值value中存储与此键值key关联的内容,键值key和value的类型可能不同。

3.2.2map的容器和元素访问

empty----------判断map是否为空

Test whether container is empty (public member function )

size--------------返回map元素的个数

Return container size (public member function )

max_size

Return maximum size (public member function )

map在元素访问的时候,有一个与operator[]类似的操作,都是通过key直接找到与key相对应的value然后将其引用返回,不同的是,当key不存在时,一般的operator[] 函数会抛出异常,而map中重载的operator[]函数会默认构造一个key和value键值对然后返回这个刚创建好的键值对的value引用。

3.2.3map中元素的修改

 

 


网站公告

今日签到

点亮在社区的每一天
去签到