【C++】map和set

这篇具有很好参考价值的文章主要介绍了【C++】map和set。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、容器补充

1.序列式容器与关联式容器

我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身,其元素与元素之间并没有什么关联性。

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

2.键值对

用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息 。
【C++】map和set,C++,c++,开发语言,数据库

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

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

二、set

1.set的介绍

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

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

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

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

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

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

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

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

2.set的使用

【C++】map和set,C++,c++,开发语言,数据库
Compare:仿函数,set中元素的比较方式。

构造函数:

【C++】map和set,C++,c++,开发语言,数据库

插入:

【C++】map和set,C++,c++,开发语言,数据库

insert 重载了三种插入方法,值、迭代器位置、迭代器区间,这里演示最常用的值插入。

void test_set1()
{
	//排序 + 去重
	//去重原理:一个值已经有了,我们就不插入了
	set<int> s;
	s.insert(3);
	s.insert(2);
	s.insert(4);
	s.insert(5);
	s.insert(1);
	s.insert(1);
	s.insert(5);

	set<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

【C++】map和set,C++,c++,开发语言,数据库

从插入数据我们可以看出,set的功能大致就是将插入的数据进行排序 + 去重,去重的原理是已经存在的值不需要再插入。

删除:
【C++】map和set,C++,c++,开发语言,数据库

erase 也重载了三种方法:
① 删除迭代器位置(必须要求迭代器有效,一般配合find使用)、
② 删除值(有这个值就删除,没有也不会报错,底层其实就是封装了迭代器删除的过程,返回值为删除元素个数)、
③ 删除迭代器区间。

void test_set1()
{
	//排序 + 去重
	//去重原理:一个值已经有了,我们就不插入了
	set<int> s;
	s.insert(3);
	s.insert(2);
	s.insert(4);
	s.insert(5);
	s.insert(1);
	s.insert(1);
	s.insert(5);

	set<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;


	s.erase(s.begin());  //删除第一个元素 迭代器位置删除
	it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	s.erase(5);      //删除值为5的位置的元素
	it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	//删除全部
	s.erase(s.begin(), s.end());
	it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

【C++】map和set,C++,c++,开发语言,数据库

3.multset的介绍

1.multiset中在底层中存储的是<value, value>的键值对

2.mtltiset的插入接口中只需要插入即可

3,与set的区别是,multiset中的元素可以重复,set是中value是唯一的

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

5.multiset中的元素不能修改

6.在multiset中找某个元素,时间复杂度为: log n

7.multiset的作用:可以对元素进行排序

4.multset的使用

multiset的使用与set几乎一摸一样,唯一不同就是multiset中允许插入重复值。

count函数,返回容器中当前值的相同值的个数

【C++】map和set,C++,c++,开发语言,数据库

equal_range函数 - 用来删除数据
【C++】map和set,C++,c++,开发语言,数据库

erase函数

删除所有的4,并返回删除个数

【C++】map和set,C++,c++,开发语言,数据库

三、map

1.map的介绍

1.map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。

2.在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容。键值 key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起, 为其取别名称为pair: typedef pair value_type;

3.在内部,map中的元素总是按照键值key进行比较排序的。

4.map中通过键值访问单个元素的速度通常比unordered_map容器(后面讲)慢,但map允许根据顺序对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。

5.map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。

6.map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))

7.map不支持修改Key,支持修改Value。

2.map的使用

【C++】map和set,C++,c++,开发语言,数据库

key: 键值对中key的类型
T: 键值对中value的类型
Compare: 比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)
Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的空间配置器
map 在使用使用上的最大区别就是多了一个模板参数V(文档中给的是T),且使用时是将KV两个模板参数封装在了pair里面。
pair的第一个参数(first)是K,第二个参数(second)是V。

插入

insert函数,参数是一个value_type ,而value_type是一个pair对象,也就是我们前面说的键值对。
insert的返回值 两种情况
1.key已经在树里面,返回pair<书里面可以所在节点的iterator,flase>
2.key不在树中,返回pair<新插入key所在节点的iterator,true>
【C++】map和set,C++,c++,开发语言,数据库>  【C++】map和set,C++,c++,开发语言,数据库

插入数据可以有三种方法,键值对插入,匿名对象插入,库函数make_pair,以及多参数隐式类型转换(C++11)

【C++】map和set,C++,c++,开发语言,数据库

删除:

可以通过某个位置的迭代器删除,也可以通过pair中first删除,也可以通过迭代器区间删除。

【C++】map和set,C++,c++,开发语言,数据库

【C++】map和set,C++,c++,开发语言,数据库

operator[]

【C++】map和set,C++,c++,开发语言,数据库

【C++】map和set,C++,c++,开发语言,数据库

所以运算符重载[],有三个作用,进行查找,插入操作,修改操作。

3.multimap的介绍

其特性与map基本一致,只是multimap中可以允许存在重复的key值

4.multimap的使用

【C++】map和set,C++,c++,开发语言,数据库


插入

返回值和map不同,因为multimap允许插入重复值,插入数据后返回插入元素的迭代器

【C++】map和set,C++,c++,开发语言,数据库
【C++】map和set,C++,c++,开发语言,数据库文章来源地址https://www.toymoban.com/news/detail-655415.html

到了这里,关于【C++】map和set的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch数据库修改分片数、副本数及修改mapping字段

            对于已经存在的索引,副本数可以随时修改。 示例演示如下:         ElasticSearch中的数据会被分别存储在不同的分片上,索引库的分片数量是在索引库创建的时候通过settings去设置的,如果不设置,分片数默认是5,分片数一旦确定就不能改变。分片数量的设

    2024年02月02日
    浏览(48)
  • 【C++】map & set

    我们前面接触过 STL 中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别? 关联式容器 也是用来存储数据的,与序列式容器

    2024年04月14日
    浏览(27)
  • 【数据结构与算法】C++的STL模板(迭代器iterator、容器vector、队列queue、集合set、映射map)以及算法例题

    更多算法例题链接: 【数据结构与算法】递推法和递归法解题(递归递推算法典型例题) 什么是迭代器(iterator) 迭代器(iterator)的定义: 迭代器是一种检查容器内元素并遍历元素的数据类型。 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。 容器

    2024年04月14日
    浏览(50)
  • 【C++】map和set

    我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身,其元素与元素之间并没有什么关联性。 关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的

    2024年02月12日
    浏览(28)
  • 【C++】map和set封装

    作者:დ旧言~ 座右铭:松树千年终是朽,槿花一日自为荣。 目标:手撕哈希表的闭散列和开散列 毒鸡汤:学习,学习,再学习 ! 学,然后知不足。 专栏选自:C嘎嘎进阶 望小伙伴们点赞👍收藏✨加关注哟💕💕 map和set的知识我们学习了,模拟实现我们已经实现了AVL树和红

    2024年04月24日
    浏览(25)
  • C++:set和map的使用

    序列式容器:比如我们之前讲的vector、string、list等均为序列式容器,特点是 按元素顺序来保存和访问 。 关联式容器:比如本次讲的map和set,和序列式容器不同,其 依靠键值来保存和访问 ,数据检索效率闭序列式容器高。 PS:本文只讲使用,set和map底层是一颗 平衡二叉搜索

    2024年02月05日
    浏览(50)
  • 【C++】set和map的使用

    对于STL容器来说,有很多相似的功能,所以这里主要将与之前不同的功能说清楚 vector/list/deque 作为序列式容器(类似于线性表的存储方式) map与set作为关联式容器,里面存储的是key,value结构的键值对(数据之间有非常强的关联关系) 键值对:用来表示一 一对应的关系,key代表键

    2024年02月04日
    浏览(35)
  • 【C++】模拟实现map和set

    关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的 键值对,在数据检索时比序列式容器效率更高。 用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代 表键值,value表示与key对应的信息。比如:现在要建立

    2024年02月01日
    浏览(38)
  • 【C++】map & set 底层刨析

    在 C++ STL 库中,map 与 set 的底层为红黑树,那么在不写冗余代码的情况下使用红黑树同时实现 map 与 set 便是本文的重点。 迭代器的好处是可以方便遍历,是数据结构的底层实现与用户透明。如果想要给红黑树增加迭代器,需要考虑以下问题: begin() 与 end() STL 明确规定,be

    2024年04月12日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包