从STL的视角,了解下Map、Set、Tuple和Initializer_List的区别

news2024/9/22 7:28:06

在这里插入图片描述

📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++阶段>——目标Windows,MySQL,Qt,数据结构与算法,Linux,多线程,会持续分享学习成果和小项目的
📖作者主页:热爱编程的小K
📖专栏链接:c++

🎉欢迎各位→点赞👏 + 收藏💞 + 留言🔔​
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🐾

在这里插入图片描述

文章目录

    • 一、map/multimap
      • 1、map/multimap的简介
      • 2、核心注意
      • 3、操作基本数据类型
      • 4、操作自定义类型
    • 二、set/multiset
      • 1、set/multiset简介
      • 2、核心注意
      • 3、操作基本类型
      • 4、操作自定义类型
    • 三、initializer_list
      • 1、概念与定义
      • 2、写一个自己的Vector
    • 四、tuple
      • 1、概念与定义
      • 2、tuple的使用


一、map/multimap

1、map/multimap的简介

map(映射)是关联容器,用于存储按特定顺序由键值映射值的组合形成的元素,即(key,value)对。它提供基于key的快速检索能力。

map中key值是唯一的。集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。

map的具体实现采用红黑树变体的平衡二叉树的数据结构。在插入操作和删除操作上比vector快。

map可以直接存取key所对应的value,支持[]操作符,如map[key]=value。

multimap与map的区别:set支持唯一键值,每个key只能出现一次;而multiset中同一key可以出现多次。map支持[]操作符,但是multmap不支持

2、核心注意

map是映射,映射就是数学的对应关系 ,例如 y=x

  • map中存储的是数对类型: pair<_Ty1,Ty2>
    • first : 键
    • second:值
  • map具有排序性,按照键排序 ,按照first进行的排序
  • map键唯一性

multimap映射,键不唯一

  • 不存在下标法插入
  • 具有排序

3、操作基本数据类型

在这里插入图片描述

void testOne() 
{	
	map<int, string> data;
	//下标法插入
	data[0] = string("king");
	data[-1] = string("空");
	//insert函数插入
	data.insert(pair<int, string>(5, "貂蝉"));
	data.insert(make_pair<int, string>(3, "妲己"));
	data.insert(pair<int, string>(3, "狂铁")); //键值相同,insert函数不做插入
	data[3] = string("孙悟空");       //下标法,保留最新值
	for (auto v : data) 
	{
		cout << v.first<< " " << v.second<< endl;
	}
	cout << endl;
	//删除
	auto iter = find_if(data.begin(), data.end(), [](const pair<int, string>& object) {return object.first == 0; });
	data.erase(iter);
	for (auto i = data.begin(); i != data.end(); i++) 
	{
		cout << i->first << " " << i->second << endl;
	}
}
void testThree() 
{
	multimap<int, string, greater<int>> test;
	test.insert(pair<int, string>(1, "king"));
	test.insert(make_pair<int, string>(2, "吕布"));
	test.insert(pair<int, string>(1, "貂蝉"));
	test.insert(make_pair<int, string>(1, "狂铁"));
	test.insert(pair<int, string>(1, "king"));
	for (auto v : test) 
	{
		cout << v.first << "\t" << v.second << endl;
	}
}

4、操作自定义类型

在这里插入图片描述

class MM 
{
public:
	MM(string name="", int age=0):name(name),age(age){}
	friend ostream& operator<<(ostream& out,const MM& object)
	{
		out << object.name << "\t" << object.age << " " << "配对:" << " ";
		return out;
	}
	int getAge()const { return age; }
protected:
	string name;
	int age;
};
struct cmpByage 
{
	bool operator()(const MM& one, const MM& two) const
	{
		return one.getAge() < two.getAge();
	}
};
class GG 
{
public:
	GG(string name = "", int age = 0) :name(name), age(age) {}
	friend ostream& operator<<(ostream& out, const GG& object) 
	{
		out << object.name << " " << object.age << endl;
		return out;
	}
protected:
	string name;
	int age;
};
void testTwo() 
{
	map<MM, GG, cmpByage> king;
	king[MM("貂蝉", 19)] = GG("狂铁", 20);
	king[MM("妲己", 28)] = GG("吕布", 29);
	king[MM("月亮", 15)] = GG("太阳", 33);
	for (auto v : king) 
	{
		cout << v.first;
		cout << v.second;
	}

}

二、set/multiset

1、set/multiset简介

set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。

set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。

multiset与set的区别:set支持唯一键值,每个元素值只能出现一次;而multiset中同一值可以出现多次
不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素。

2、核心注意

set叫做集合,这个容器具有两个特性

  • 自带排序
  • 去重

多重集合 multiset

  • 只具有排序性

3、操作基本类型

在这里插入图片描述
在这里插入图片描述

void testOne() 
{
	set<int> test;
	set<int, less<int>> test1; //和默认的一样,都是从小到大
	test.insert(1);
	test.insert(1);
	test.insert(0);
	test.insert(9);
	test.insert(5);
	for (auto v : test) 
	{
		cout << v << " ";
	}
	cout << endl;
	//删除操作
	auto iter = find_if(test.begin(), test.end(), [](int var) {return var == 1; });
	test.erase(iter);
	for (auto v : test) 
	{
		cout << v << " ";
	}
	cout << endl;
}
void testthree()
{
	multiset<int, greater<int>> king;
	king.insert(1);
	king.insert(1);
	king.insert(1);
	king.insert(0);
	king.insert(999);
	for (auto v : king) {
		cout << v << " ";
	}

}

4、操作自定义类型

注意自己写排序准则

在这里插入图片描述

class MM {
public:
	MM(string name=" ",int age=0):name(name),age(age){}
	friend ostream& operator<<(ostream& out, const MM& object) 
	{
		out << object.name << " " << object.age << endl;
		return out;
	}
	int getAge()const { return age; }
protected:
	string name;
	int age;
};
class cmpByage {
public:
	bool operator()(const MM& one, const MM& two) const 
	{
		return one.getAge() < two.getAge();
	}
};
void testTwo()
{
	set<MM, cmpByage> info;
	info.insert(MM("king", 19));
	info.insert(MM("妲己", 18));
	info.insert(MM("貂蝉", 22));
	for (auto v : info) {
		cout << v;
	}
}

三、initializer_list

1、概念与定义

initializer_list是列表数据,就是{a,b,c…}数据

initializer_list是C++标准库的一个特性,它允许您将一系列值传递给函数或构造函数。它在C++11中引入,并在<initializer_list>头文件中定义。initializer_list是一个包含相同类型元素序列的对象。它类似于数组,但是它是只读的并且具有固定的大小。您可以使用它来初始化各种类型的对象,包括数组、向量和用户定义的类型。因此,initializer_list的作用是允许您使用列表初始化语法来初始化各种类型的对象,包括数组、向量和用户定义的类型。

2、写一个自己的Vector

myVector(int size) :curSize(0) { pre = new _Ty[size]; }实现了vector后面更小括号的方式开大小的方法myVector(const initializer_list<_Ty>& data) :pre(new _Ty[data.size()])

{ for (auto v : data) { pre[curSize++] = v; } }实现了列表初始化的方式

在这里插入图片描述

#include<iostream>
#include<initializer_list>
using namespace std;
template<class _Ty> class myVector 
{
public:
	myVector(int size) :curSize(0) { pre = new _Ty[size]; }
	myVector(const initializer_list<_Ty>& data) :pre(new _Ty[data.size()]) {
		for (auto v : data) 
		{
			pre[curSize++] = v;
		}
	}
	void printData() {
		for (int i = 0; i < curSize; i++) 
		{
			cout << pre[i] << " ";
		}
		cout << endl;
	}
protected:
	_Ty* pre;
	int curSize;
};
int main() 
{
	myVector<int> test1 = { 1,2,5,8,9,10 };
	test1.printData();
	myVector<int> test2 = { 2,5,8,9,0 };
	test2.printData();
	return 0;
}

四、tuple

1、概念与定义

tuple是C++标准库的一个特性,它允许您将多个值作为一个整体进行处理。它在C++11中引入,并在头文件中定义。
tuple是一个包含不同类型元素的序列的对象。它类似于结构体,但是它是只读的并且没有成员名称。您可以使用它来返回多个值,或者将多个值作为参数传递给函数。tuple就是元组的意思,它是一个可变参模板类,也就是传入的参数随便写,并且数目不定

2、tuple的使用

  • 可以通过get方法获取,获取下标必须是常量,类型转换也不行,所以使用比较舒服,但是调用比较困难
  • 可以通过宏定义,简便获取
  • 可以通过tie函数获取
  • tuple_cat可以实现两个元组之间的拼接

在这里插入图片描述

#include<iostream>
#include<tuple>
#include<string>
using namespace std;
void testOne() 
{
	tuple<string, int, int, double> data = { "king",1,2,2.33 };
	tuple<string, int, float, double> data1 = { "貂蝉",1,2.99,9.33 };
	//get方法获取,获取下标必须是常量,类型转换也不行,所以使用比较舒服,但是调用比较困难
	cout << get<0>(data1) << " " << get<1>(data1) << " " << get<2>(data1) << " " << get<3>(data1) << " " << endl;
#define Data(index) get<index>(data1)
	cout << Data(0) << " " << Data(1) << " " << Data(2) << " " << Data(3) << endl;
	string a;
	int b;
	float c;
	double d;
	tie(a, b, c, d) = data1;
	cout << a << " " << b << " " << c << " " << d << endl;
	//忽略数据
	tie(a, ignore, ignore, ignore) = data1;
	cout << a << endl;
	//拼接数据
	auto info = tuple_cat(data, data1);
	cout << get<0>(info) << " " << get<1>(info) << " " << get<2>(info) << " "
		<< get<3>(info) << " " << get<4>(info) << " " << get<5>(info) << " "
		<< get<6>(info) << " " << get<7>(info) << endl;
}
int main() 
{
	testOne();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/456529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React-Native启动页

本文将从 Android 和 IOS 两端分别详细介绍APP是如何设置名称、图标以及启动页的。 首先我们到 图标工厂 上传一张 1024x1024 的图标&#xff0c;然后一键生成所有尺寸的图标&#xff0c;下载下来供两端使用。 IOS端 设置名称 在 Xcode 中点击你的项目修改右侧 Display Name …

深入浅出MySQL——MySQL基础

文章目录 数据库基础数据库概念主流数据库服务器&#xff0c;数据库&#xff0c;表关系基本使用MySQL架构SQL语句分类存储引擎 库的操作创建数据库创建数据库案例字符集和校验规则操纵数据库 表的操作创建表查看表结构修改表删除表 数据类型数据类型分类数值类型字符串类型 表的…

【华为机考】专题突破 第一周:单调栈 739 、503 、901、84

刷题顺序参考于 《2023华为机考刷题指南&#xff1a;八周机考速通车》 前言 单调栈&#xff1a;分为单调递增和单调递减栈。(栈内元素成递增或者递减性)&#xff1a; 单调递增栈&#xff1a;从栈底到栈顶数据是从大到小&#xff0c;即 栈内的元素从栈顶 到栈底 是递增的&#x…

react-10 函数式写法rsc,配合HOOKS钩子函数

性能优化&#xff1a;useMemo &#xff1a;用于组件性能优化&#xff08;缓存计算属性&#xff0c;变化才执行&#xff09;是通过缓存值的方式实现性能优化 useMemo(callback, array)&#xff1a;性能优化&#xff0c;利用了闭包的特性&#xff0c;会返回一个记忆值, 通过 记…

3D线光谱共焦位移传感器在医疗领域的应用

随着社会的发展&#xff0c;越来越多的行业对微观物体表面形貌的观察提出了越来越高的要求。与生命健康息息相关的医疗行业就是其中之一。但是传统的显微镜只能达到聚焦区域的图像清晰&#xff0c;非聚焦区域图像模糊。因此&#xff0c;普通显微镜无法在相同景深下实现对物体表…

两大消息爆出,币圈正在响应全球“去美元化”行动

为了维持美元霸权、对全球进行收割&#xff0c;美联储连续加息反而拉爆了自家银行。欧美银行危机事件&#xff0c;让人们觉得把钱放在银行里并不安全&#xff0c;加密货币的去中心化本质&#xff0c;令币圈逆风翻盘。数据显示&#xff0c;比特币今年上涨了近72%&#xff0c;这可…

《编码——隐藏在计算机软硬件背后的语言》精炼——第12章(二进制加法器)

“I hear and I forget. I see and I remember. I do and I understand”——Confucius 人类计算二进制数的方法 我们先计算本位的结果&#xff0c;称为加法位&#xff1b;再计算是否进位&#xff0c;称为进位位。 搭建二进制加法器 我们用逻辑门来搭建二进制加法器。它的思想…

CHAPTER 8: 《DESIGN A URL SHORTENER》第8章 《设计一个url伸缩器》

CHAPTER 8: DESIGN A URL SHORTENER 在这一章中&#xff0c;我们将解决一个有趣而经典的系统设计面试问题:设计一个像tinyurl这样的网址缩短服务。 步骤1 -理解问题并确定设计范围 系统设计面试的问题是故意留下开放式的。精心设计系统中&#xff0c;提出澄清性问题是至关重…

HDCTF 2023 复盘

web yamiyami 当时考虑直接读的/proc/self/environ 读到flag是not_flag 就没考虑过/proc/1/environ了 然后不知道py3URL二次编码的特性,读不到源码,无从下手 做flask算pin码的题做多了,还以为pid是1的就是self,难顶 上面那种是非预期 预期是yaml反序列化 先读源码 /read?u…

产品推荐丨智慧水利行业应用终端+云平台

智慧水利是我国智慧城市建设的重要延伸&#xff0c;是新时代水利现代化的战略目标&#xff0c;贯穿于防汛抗旱减灾、水资源合理配置和高效利用、水资源和河湖健康保障等体系。随着水利技术的集成发展与场景的成熟应用&#xff0c;我国水利现已完成从自动化阶段到信息化阶段的过…

学习系统编程No.13【文件系统】

引言&#xff1a; 北京时间&#xff1a;2023/3/31/7:48&#xff0c;该篇博客在两天前本就应该产出&#xff0c;但是摆烂谁拦得住&#xff0c;所以呜呜呜&#xff01;本以为欠的钱也要快还完了&#xff0c;没想到啊&#xff0c;越欠越多&#xff0c;烦人&#xff01;但是&#…

领略未来无需远方,华为全屋智能将在AWE描绘智慧生活新图景

作者 | 曾响铃 文 | 响铃说 4月27日-30日&#xff0c;AWE 2023中国家电及消费电子博览会将在上海新国际博览中心举行&#xff0c;这是AWE展沉淀两年后的再次回归。 作为家电及消费电子领域TOP3的国际盛会&#xff0c;本届AWE以“智科技&#xff0c;创未来”为主题&#xff0…

Redis 数据存储原理

核心模块如图 1-10。 图1-10 图 1-10 Client 客户端&#xff0c;官方提供了 C 语言开发的客户端&#xff0c;可以发送命令&#xff0c;性能分析和测试等。 网络层事件驱动模型&#xff0c;基于 I/O 多路复用&#xff0c;封装了一个短小精悍的高性能 ae 库&#xff0c;全称是 …

如何写好学位论文

昨天刚提交了学位论文&#xff0c;今天准备来总结一下一些常用的Word写作技巧。 样式与多级列表 论文一般都会对章节条目的标题、参考文献、表格内容、题注的字体字号、行间距、段落间距等作出规定。为每一类文字设置一种样式&#xff0c;在写的时候直接应用样式可以方便地对全…

研报精选230421

目录 【行业230421南京证券】氢能行业&#xff1a;地缘政治加速绿色能源转型 【行业230421华安证券】AIGC行业研究框架与投资逻辑 【行业230421信达证券】工控行业深度报告&#xff1a;行业拐点将至&#xff0c;国产品牌加速崛起 【个股230421国信证券_华阳集团】聚焦汽车智能化…

ruoyi启动前端报错‘vue-cli-service‘ 不是内部或外部命令

解决方案&#xff1a; 在新项目的pack.json的文件目录&#xff0c;执行命令npm install 或者 cnpm install 如果报npm 不是内部命令&#xff0c;需要在系统配置全局的变量 在使用npm的时候&#xff0c;或者是通过npm下载了一些包&#xff0c;使用这些包的时候&#xff0c;有时…

LightGBM模型详解

1.背景 LightGBM 是微软开发的 boosting 集成模型&#xff0c;和 XGBoost 一样是对 GBDT 的优化和高效实现&#xff0c;原理有一些相似之处&#xff0c;但它很多方面比 XGBoost 有着更为优秀的表现。官方给出的这个工具库模型的优势如下&#xff1a; 更快的训练效率低内存使用…

全网最详细,web自动化测试窗口框架与验证码登录处理(超详细实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 selenium的作用域…

传输协议特点大比拼之TCP

文章目录 前言一.Tpc报头格式源端口和目的端口&#xff1a;序列号&#xff1a;确认号&#xff1a;数据偏移&#xff1a;控制位&#xff1a;窗口大小&#xff1a;校验和&#xff1a;紧急指针&#xff1a; 二.TPC原理2.1 确认应答机制2.2 超时重传机制2.3 连接管理机制2.3.1 三次…

档案室温湿度相关资料

国家档案局《档案库房技术管理暂行规定》对档案库房(也适用于机关档案室)温湿度要求做了如下明确界定&#xff1a;档案库房(含胶片室、磁带室)的温度应控制在14&#xff5e;24℃&#xff0c;有设备的库房日变化幅度不超过2℃&#xff0c;相对湿度应控制在45&#xff5e;60%&…