【C++】set 类 和 map 类

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

【C++】set 类 和 map 类,c++

1. 关联式容器

关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的

键值对,在数据检索时比序列式容器效率更高

2. 键值对

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

表键值,value表示与key对应的信息

代码

template <class T1, class T2>
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类 和 map类

set 类的介绍:

  1. set 类的实现底层就是红黑树,该容器可以进行双向迭代,且它是有序的
  2. 与哈希不同,它 和 map 都是树形结构

a. set 类的使用

  1. set 类的模板参数

【C++】set 类 和 map 类,c++

    2. set 类的构造

【C++】set 类 和 map 类,c++

     3.  set 类的修改

函数声明

pair<iterator,bool> insert

( const value_type& x )

功能介绍

set中插入元素x,实际插入的是<x, x>构成的

键值对,如果插入成功,返回<该元素在set中的

位置,true>,如果插入失败,说明xset中已经

存在,返回<x在set中的位置,false>

注意:

返回类型

【C++】set 类 和 map 类,c++

是一个键值对

iterator代表新插入元素的位置,bool代表释放插入成功

函数声明

void erase ( iterator position )

void erase ( const value_type& x )

功能介绍

删除set中position位置上的元素

删除set中元素 x

函数声明                                                                                   

iterator find                                                                   

( const key_type& x ) const

功能介绍

返回set中值为x的元素的位置

函数声明

void erase

( iterator first, iterator last )

功能介绍

删除set中[ first, last ) 位置上的元素

  1. set 类的容量

函数声明

bool empty ( ) const

功能介绍

检查 set 是否为空

函数声明

size_type size() const

功能介绍

返回set中有效元素的个数

b. map 类的使用

  1. map 的构造
  • map()
  • map(InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& = Allocator())
  1. map 的修改

函数声明

pair<iterator,bool> insert

( const value_type& x )

功能介绍

在map中插入键值对x,注意x是一个键值

,返回值也是键值对:iterator代表新插入

元素的位置,bool代表释放插入成功

代码举例

#include<iostream>
using namespace std;
#include<map>
int main()
{
	map<int, int> s;
	s.insert(make_pair(10, 2)); //make_pair 是模板函数
  // s.insert(pair<int,int>(10,2))  也是对的
	auto it = s.begin(); //it 是迭代器
	while (it != s.end())
	{
		cout << it->first << ":" << (*it).second << endl; //*it 是键值对 
		++it;
	}
}

【C++】set 类 和 map 类,c++

真正写法是 it->->first (省略了一个->,这里用法提过一次,具体看底层实现)

函数声明

size_type erase ( const key_type& x )

void erase ( iterator position )

void erase ( iterator first, iterator last )

功能介绍

删除键值为x的元素

删除position位置上的元素

删除[first, last)区间中的元素

  1. map 的容量和访问

【C++】set 类 和 map 类,c++

【C++】set 类 和 map 类,c++

这里明显用了运算符重载了[] , 传的参数是key_vaule 模型里面的 key ,返回得到的是 vaule 本身(既可被访问也可被修改)

代码举例

#include<iostream>
using namespace std;
#include<map>
int main()
{
	string arr[] = { "苹果", "香蕉" ,"苹果" ,"梨" ,"葡萄" };
	map<string, int> s;
	for (auto i : arr)
	{
		s[i]++;
	}
	auto it = s.begin();
	while (it != s.end())
	{
		cout << it->first << ":" << it->second << endl;
		++it;
	}
}

运行结果:

【C++】set 类 和 map 类,c++

实现原理

【C++】set 类 和 map 类,c++

不看后置++,单看[] , 实际上里层是调用了 insert 函数 , 返回

【C++】set 类 和 map 类,c++

这个类型的,再用 .first(iterator 类型) ,返回 它的 ->second (就是 value 了)

c. multiset类 的使用

与 set 类的不同的是:multiset 类 不会去重

d. multimap类 的使用

与 map 类的不同的是:multimap类 不会去重文章来源地址https://www.toymoban.com/news/detail-854535.html

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

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

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

相关文章

  • 【C++】红黑树 --- map/set 底层

    红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是 Red 或 Black . 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的;如下图: 每个结点不是红色就是黑色;

    2024年02月04日
    浏览(27)
  • 【C++】set 类 和 map 类

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

    2024年04月17日
    浏览(15)
  • 【C++】map和set深度讲解

    作者简介:დ旧言~,目前大二,现在学习Java,c,c++,Python等 座右铭:松树千年终是朽,槿花一日自为荣。 目标:熟练掌握map和set容器。 毒鸡汤:得知坦然,失之淡然,争之必然,顺其自然。 望小伙伴们点赞👍收藏✨加关注哟💕💕  早期我们学习了顺序容器(vector,li

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

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

    2024年04月12日
    浏览(24)
  • 【C++】map和set的封装

    在STL中,map和set都是使用的红黑树 map与set在STL中实现是一样的 对于value_type,map的第二个模板参数是pair,而set的第二个模板参数是key 这样写是为了map和set使用同一颗红黑树去复用map和set set K - rb_treeK,K mapK,V - rb_treeK,pairconst K,V 第一个模板参数拿到单独K的类型,使用Find erase接

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

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

    2024年02月01日
    浏览(28)
  • C++:set和map的使用

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

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

    我们可以知道,set属于K模型的容器,map属于KV模型的容器,那我们如何使用一棵红黑树来实现map和set呢? 我们就需要控制map和set传入底层红黑树的模板参数,为了与原红黑树的模板参数进行区分,我们将红黑树第二个模板参数的名字改为T。 T模板参数可能只是键值Key,也可能

    2024年02月09日
    浏览(33)
  • C++【红黑树封装map&&set】

    我们在开始之前,首先要明白一点,前面我们实现模拟实现红黑树以及现在的封装map和set,我们的目的主要学习它库中的框架及模板设计和复用,不是要原模原样的去实现。 先看库中的代码,取了核心代码。我们可以看到kv搞出来value_type,就是相关pair,pair里面的key是const,

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

    喜欢的点赞,收藏,关注一下把! 在前面几篇C++的博客,讲过了二叉搜索树,AVL树,红黑树。 今天我们就用红黑树模拟实现map和set。 那现在就有一个问题了。给你一颗红黑树你该如果用它模拟实现map和set呢?但是map是KV模型的,set是K模型的。难道分别给一颗红黑树照着改吗

    2024年02月02日
    浏览(27)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包