【C++干货铺】STL中set和map的介绍和使用

2024-02-26 1395阅读

温馨提示:这篇文章已超过393天没有更新,请注意相关的内容是否还可用!

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

个人主页点击直达:小白不是程序媛

C++系列专栏:C++干货铺

代码仓库:Gitee

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

目录

序列式容器

关联式容器

键值对

树形结构的关联式容器

set

set的介绍

set的使用

set的模板参数列表

set的构造

​编辑 set的容量

set的删除和查找

multiset

multiset的介绍

multiset的使用

map

map的介绍

map的使用

map的模板参数说明

map的迭代器

map的容量与元素的访问

map中元素的修改

map的终极操作operator[] 

multimap 

multimap的介绍

multimap的使用


序列式容器

在之前的文章中,我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。


关联式容器

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


键值对

用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代

表键值,value表示与key对应的信息。比如:现在要建立一个英汉互译的字典,那该字典中必然

有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该应

该单词,在词典中就可以找到与其对应的中文含义。

【C++干货铺】STL中set和map的介绍和使用

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)
    {}
};

树形结构的关联式容器

根据应用场景的不桶,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。

树型结构的关联式容器主要有四种:map、set、multimap、multiset。

这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。下面一依次介绍每一个容器。 


set

set的介绍

set的文档介绍

【C++干货铺】STL中set和map的介绍和使用

翻译:

1. set是按照一定次序存储元素的容器

2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。

set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。

3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。

4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对

子集进行直接迭代。

5. set在底层是用二叉搜索树(红黑树)实现的。 

注意:

1. 与map/multimap不同,map/multimap中存储的是真正的键值对,set中只放

value,但在底层实际存放的是由构成的键值对。

2. set中插入元素时,只需要插入value即可,不需要构造键值对。

3. set中的元素不可以重复(因此可以使用set进行去重)。

4. 使用set的迭代器遍历set中的元素,可以得到有序序列

5. set中的元素默认按照小于来比较

6. set中查找某个元素,时间复杂度为:log2(n)

7. set中的元素不允许修改

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

set的使用

set的模板参数列表

【C++干货铺】STL中set和map的介绍和使用

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

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

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

set的构造

函数声明功能介绍
set(const Compare&comp = Compare(), const Allocator& = Allocator() );构造空set

set(Inputlterator first , Inputlterator last , const Com pare& comp = Compare

,cosnst Allocator& = Allocator() );

用[first,last)区间中的元素构造set
set (const set&x);set的拷贝构造
void test_set()
{
	//空构造
	set s1;
	s1.insert(4);
	s1.insert(3);
	s1.insert(2);
	s1.insert(1);
	//拷贝构造
	set s2 = s1;
	//区间构造
	int arr[] = { 1,2,3,4 };
	set s3(arr, arr + 4);
}

【C++干货铺】STL中set和map的介绍和使用

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

void test_set1()
{
	set s;
	s.insert(4);
	s.insert(4);
	s.insert(3);
	s.insert(3);
	s.insert(2);
	pair pa = s.insert(2);
	cout 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]