C++ STL-map与set的使用

目录

序列式容器与关联式容器

        序列式容器

        关联式容器

区别 

关联式容器:map和set

set的使用

        set类

        set的构造与迭代器

         示例(构造)

set的增删查(不支持改!) 

示例(insert与迭代器)

示例(find与erase与cout的使用) 

 示例(lower与upper的使用)

 multiset与set的差异

 map的使用

        map类

        pair类

        map的构造 

 map的增删查

示例(增删查) 

map的数据修改 

map的 [ ]案例

 multimap与map的差异

 键值唯一性

操作符支持

插入与返回值


序列式容器与关联式容器

        序列式容器和关联式容器是C++标准模板库(STL)中的两大类容器

        序列式容器

序列式容器存储的元素在逻辑上呈现为线性序列。这些容器的共同特点是,它们允许通过位置(索引)来访问元素,且元素之间的相对位置是固定的,除非进行插入或删除操作。常见的序列式容器包括:

  1. vector:一个动态数组,支持随机访问,但在中间插入或删除元素时可能需要移动大量元素。

  2. deque(双端队列):一个支持在两端高效插入和删除的动态数组。它提供了随机访问功能,但与vector相比,在两端进行操作时性能更优。

  3. list:一个双向链表,不支持随机访问,但在任意位置插入和删除元素时性能较好。

  4. forward_list:一个单向链表,与list相比,它只支持向前遍历,但内存开销更小。

  5. array:一个固定大小的数组,不支持动态调整大小,但提供了与vector类似的随机访问性能。

        关联式容器

关联式容器存储的元素是按关键字(key)组织起来的,这些关键字用于快速查找、插入和删除元素。关联式容器通常基于平衡二叉树(如红黑树)或哈希表实现。常见的关联式容器包括:

  1. map:一个关联数组,存储键值对(key-value pairs),其中每个键都是唯一的。map中的元素按键的升序排列(默认情况下,可以通过提供自定义比较函数来改变排序规则)。

  2. set:一个元素集合,其中每个元素都是唯一的。set中的元素按升序排列(同样可以通过提供自定义比较函数来改变排序规则)。

  3. unordered_map:一个基于哈希表的关联数组,存储键值对,其中键不需要唯一(但通常在实际使用中保持唯一以避免未定义行为),且不支持按键排序。查找、插入和删除操作的时间复杂度平均为O(1)。

  4. unordered_set:一个基于哈希表的元素集合,其中每个元素都是唯一的,且不支持排序。查找、插入和删除操作的时间复杂度平均为O(1)。

区别 

  • 访问方式:序列式容器主要通过位置(索引)访问元素,而关联式容器主要通过关键字访问元素。
  • 有序性:默认情况下,map和set中的元素按键的升序排列,而unordered_map和unordered_set中的元素则无序。
  • 性能:在序列式容器中,随机访问(如vector)通常很快,但在中间插入或删除元素可能较慢。在关联式容器中,查找、插入和删除操作的时间复杂度通常为O(log n)(对于基于红黑树的容器)或O(1)(对于基于哈希表的容器)。
  • 内存使用:序列式容器(如vector)在连续内存中存储元素,通常具有较低的内存碎片。而关联式容器(特别是基于哈希表的容器)可能由于哈希冲突和动态调整大小而导致较高的内存开销。

关联式容器:map和set

        map

  • 定义:map是一个关联容器,它存储的是键值对(key-value pairs)。
  • 特性
    • map中的元素按键的升序排列(默认情况下,可以通过自定义比较函数来改变排序规则)。
    • key在map中是唯一的。
    • 每个元素都是一个pair,其第一个元素是key(键),第二个元素是value(值)。

        set

  • 定义:set是一个关联容器,它存储的是唯一的元素(即key)。
  • 特性
    • set中的元素是唯一的。
    • set中的元素按升序排列(默认情况下,同样可以通过自定义比较函数来改变排序规则)。

set的使用

        set类

  • set的声明需要T(也就是关键字Key的类型)
  • set默认T排序支持小于排序,也可以写仿函数自行提供排序方式
  • set的储存数据内存是从空间配置器来申请,也可以自己实现内存池
  • set的第二个和第三个模板参数一般不需要自己填写
  • set的底层是红黑树,增删查改效率为O(logN),是有序的,迭代器走的是中序
template < class T,                        // key类型T
           class Compare = less<T>,        // Compare的比较仿函数
           class Alloc = allocator<T>      // 内存池
           > class set;

        set的构造与迭代器

  • set的构造与之的STL构造一样
  • set的迭代器支持正向和反向迭代器,遍历默认升序
  • 支持范围for
  • 迭代器不支持修改数数据,不能修改key 
//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);

//这里还有一个移动构造 移动构造函数我会但开一篇

//初始化器列表 (5)	
set (initializer_list<value_type> il,
     const key_compare& comp = key_compare(),
     const allocator_type& alloc = allocator_type());
//迭代器 双向迭代器
iterator	a bidirectional iterator to const value_type	
//const
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值