【C++庖丁解牛】基于红黑树实现的两种常用的关联容器map和set以及multimap
🍁你好,我是 RO-BERRY
📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识
🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油
目录
- 1. 关联式容器
- 2. 键值对
- 3. 树形结构的关联式容器
- 4. set的介绍
- 5. set的使用
- 5.1 set的模板参数列表
- 5.2 set的构造
- 5.3 set的迭代器
- 5.4 set的容量
- 5.5 set修改操作
- 5.6 set的使用举例
- 构造及其遍历
- find and erase
- count
- lower_bound
- upper_bound
- equal_range
- 6. map的介绍
- 7.map的使用
- 7.1 map的模板参数说明
- 7.2 map的构造
- 7.3 map的迭代器
- 7.4 map的容量与元素访问
- 7.5 map中元素的修改
- 7.5 pair函数
- 8. multiset的介绍
- 9.multiset的使用
1. 关联式容器
在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?
关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高。
2. 键值对
用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该应该单词,在词典中就可以找到与其对应的中文含义。
SGI-STL中关于键值对的定义:
template struct pair { typedef T1 first_type; typedef T2 second_type; T1 first; T2 second; pair() : first(T1()) , second(T2()) {} pair(const T1& a, const T2& b) : first(a) , second(b) {} };3. 树形结构的关联式容器
根据应用场景的不桶,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。下面一依次介绍每一个容器。
4. set的介绍
- set是按照一定次序存储元素的容器
- 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
- 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
- set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。
- set在底层是用二叉搜索树(红黑树)实现的。
注意:
- 与map/multimap不同,map/multimap中存储的是真正的键值对,set中只放value,但在底层实际存放的是由构成的键值对。
- set中插入元素时,只需要插入value即可,不需要构造键值对。
- set中的元素不可以重复(因此可以使用set进行去重)。
- 使用set的迭代器遍历set中的元素,可以得到有序序列
- set中的元素默认按照小于来比较
- set中查找某个元素,时间复杂度为: l o g 2 n log_2 n log2n
- set中的元素不允许修改(为什么?)
- set中的底层使用二叉搜索树(红黑树)来实现
5. set的使用
5.1 set的模板参数列表
T:set中存放元素的类型,实际在底层存储的键值对。
Compare:set中元素默认按照小于来比较
Alloc:set中元素空间的管理方式,使用STL提供的空间配置器管理
5.2 set的构造
函数声明 功能介绍 set (const Compare& comp = Compare(), const Allocator& = Allocator() ); 构造空的set set (InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& = Allocator() ); 用[first, last)区间中的元素构造set set ( const set& x); set的拷贝构造 5.3 set的迭代器
函数声明 功能介绍 iterator begin() 返回set中起始位置元素的迭代器 iterator end() 返回set中最后一个元素后面的迭代器 const_iterator cbegin() const 返回set中起始位置元素的const迭代器 const_iterator cend() const 返回set中最后一个元素后面的const迭代器 reverse_iterator rbegin() 返回set第一个元素的反向迭代器,即end reverse_iterator rend() 返回set最后一个元素下一个位置的反向迭代器,即rbegin const_reverse_iterator crbegin() const 返回set第一个元素的反向const迭代器,即cend const_reverse_iterator crend() const 返回set最后一个元素下一个位置的反向const迭代器,即crbegin 5.4 set的容量
函数声明 功能介绍 bool empty ( ) const 检测set是否为空,空返回true,否则返回true size_type size() const 返回set中有效元素的个数 5.5 set修改操作
函数声明 功能介绍 pair insert ( const value_type& x ) 在set中插入元素x,实际插入的是构成的键值对,如果插入成功,返回,如果插入失败,说明x在set中已经存在,返回 void erase ( iterator position ) 删除set中position位置上的元素 size_type erase ( const key_type& x ) 删除set中值为x的元素,返回删除的元素的个数 void erase ( iterator first, iterator last ) 删除set中[first, last)区间中的元素 void swap ( set& st ); 交换set中的元素 void clear ( ) 将set中的元素清空 iterator find ( const key_type& x ) const 返回set中值为x的元素的位置 size_type count ( const key_type& x ) const 返回set中值为x的元素的个数 5.6 set的使用举例
构造及其遍历
#include using namespace std; #include void test_set1() { set s; s.insert(5); s.insert(1); s.insert(2); s.insert(3); s.insert(4); s.insert(4); s.insert(6); s.insert(6); set::iterator it = s.begin(); while (it != s.end()) { cout cout test_set1(); return 0; } set cout cout cout test_set1(); return 0; } set cout cout cout test_set1(); return 0; } set10, 20, 30, 40, 50}; auto it = mySet.lower_bound(25); if (it != mySet.end()) { cout cout set10, 20, 30, 40, 50}; auto it = mySet.upper_bound(25); if (it != mySet.end()) { cout cout set1, 2, 3, 4, 5}; auto range = mySet.equal_range(3); cout cout typedef T1 first_type; typedef T2 second_type; T1 first; T2 second; pair(); pair(const T1& x, const T2& y); template map"peach", "桃子"}); // 将键值对 int array[] = { 2, 1, 3, 9, 6, 0, 5, 8, 4, 7 }; // 注意:multiset在底层实际存储的是
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!


