cpp的set

一、关联式容器和键值对

1.关联式容器

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

2.键值对

用来表示具有一一对应关系的一种结构,key表示键value表示值,key与value有对应的关系,比如字典,key表示英文单词,value表示中文翻译。

二、pair

pair是一种简单的数据结构,用于存储两个相关联的对象,内部包含两个元素一个是key一个是value两个元素都可以自定义类型,key可以用pair.first表示,value可以用pair.second表示

#include<iostream>
#include<utility>
#include<string>
using namespace std;
int main()
{
	pair<string, string> Pass;
	Pass.first = "apple";
	Pass.second = "苹果";
	cout <<"Pass.first :" << Pass.first << endl;
	cout << "Pass.second :" << Pass.second << endl;
	return 0;
}

三、树形结构的关联式容器

树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。下面一依次介绍每一个容器。

1.set

特点:

1、set是按照一定次序存储的容器。

2、set中的元素不能修改它总是被const修饰的,单可以插入和删除。

3、set中value和key是相同的,且每个value的值是唯一的,不存在两个相同的value值。

4、set的底层是通过红黑树实现的。

注意:

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

2、在set插入一个元素时只需要传一个value值,不需要构造键值对。

3、set中的元素默认按照小于来比较。

4、set中的元素不能改变。

5、set中的元素不能重复(可用于去重)。

6、set的迭代器遍历set中的元素是中序,可以得到有序序列。

7、set中查找某个元素的时间复杂度是O(log n)。

使用:
1、set的模板参数

T: set中存放元素的类型,实际在底层存储<value, value>的键值对。
Compare:set中元素默认按照小于来比较
Alloc:set中元素空间的管理方式,使用STL提供的空间配置器管理
 2、set的构造

(1) 空容器构造函数(默认构造函数)
          构造一个没有元素的空容器。
(2) Range 构造函数
          构造一个容器,其中包含与范围 [first,last] 一样多的元素,每个元素都由该区域中的相应              元素构造。
(3) 复制构造函数
           使用 x 中每个元素的副本构造一个容器。

	set<int> Sei1;// 构造一个没有元素的空容器。
	set<int> s;
	s.insert(3);
	s.insert(1);
	s.insert(7);
	s.insert(9);
	s.insert(5);
	set<int> Sei2(s.begin(), s.end());//构造一个容器,其中包含与范围 [first,last] 一样多的元素,每个元素都由该区域中的相应元素构造。
	set<int> Sei3(s);
	cout << "s: ";
	for (const auto& i : s)
	{
		cout << i << ' ';
	}
	cout << endl;
	cout << "Sei2: ";
	for (const auto& i : Sei2)
	{
		cout << i << ' ';
	}
	cout << endl;
	cout << "Sei3: ";
	for (const auto& i : Sei3)
	{
		cout << i << ' ';
	}
	cout << endl;

3、set的插入 insert

通过插入新元素来扩展容器,从而有效地增加容器大小(按插入的元素数)。由于集中的元素是唯一的,因此插入操作会检查每个插入的元素是否等效于容器中已有的元素,如果是,则不会插入该元素,而是返回此现有元素的迭代器(如果函数返回值)。

set<int> si;
si.insert(5);//插入5
si.insert(7);//插入7

cout << "si: ";
for (const auto& i : si)
{
	cout << i << ' ';
}

 

4、set的删除erase 

从集合容器中删除单个元素或一系列元素 ([first,last)]。这实际上通过删除的元素数(被销毁)来减小容器大小。

	set<int> s;
	s.insert(3);
	s.insert(1);
	s.insert(7);
	s.insert(9);
	s.insert(5);
	cout << "s: ";
	for (const auto& i : s)
	{
		cout << i << ' ';
	}
	cout << endl;
	s.erase(4);//删除一个不存在的元素
	s.erase(1);
	s.erase(5);
	cout << "s: ";
	for (const auto& i : s)
	{
		cout << i << ' ';
	}
	cout << endl;

 5、set的清除clear

 从设置的容器中删除所有元素(已销毁),使容器的大小为 0。

	set<int> s;
	s.insert(3);
	s.insert(1);
	s.insert(7);
	s.insert(9);
	s.insert(5);
	cout << "s: ";
	for (const auto& i : s)
	{
		cout << i << ' ';
	}
	cout << endl;
	cout << "s: ";
	s.clear();//清除所有元素
	for (const auto& i : s)
	{
		cout << i << ' ';
	}
	cout << endl;

6、set的查找find

在容器中搜索等效于 val 的元素,如果找到,则返回一个迭代器,否则返回一个迭代器 set::end。如果容器的比较对象反射性地返回 false(即,无论元素作为参数传递的顺序如何),则认为集合的两个元素是等效的。

	set<int> s;
	s.insert(3);
	s.insert(1);
	s.insert(7);
	s.insert(9);
	s.insert(5);
	cout << "s: ";
	for (const auto& i : s)
	{
		cout << i << ' ';
	}
	cout << endl;
	auto it= s.find(1);//查找1并返回1的迭代器
	s.erase(it);//删除迭代器的值
	//it = s.find(2);//
	//s.erase(it);//删除迭代器的值
	cout << "s: ";
	for (const auto& i : s)
	{
		cout << i << ' ';
	}
	cout << endl;

 7、set的计数count

在容器中搜索相当于 val 的元素,并返回匹配项的数量。由于集容器中的所有元素都是唯一的,因此该函数只能返回 1(如果找到元素)或 0(否则)。如果容器的比较对象反射性地返回 false(即,无论元素作为参数传递的顺序如何),则认为集合的两个元素是等效的。


    set<int> s;
	s.insert(3);
	s.insert(1);
	s.insert(7);
	s.insert(9);
	s.insert(5);
	cout << "s: ";
	for (const auto& i : s)
	{
		cout << i << ' ';
	}
	cout << endl;
	cout << s.count(1) << endl;//计算有几个1
	cout << s.count(2)<<endl;//计算有几个2

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3学习宝典

1.ref函数调用的方式生成响应式数据&#xff0c;可以传复杂和简单数据类型 <script setup> // reactive接收一个对象类型的数据 import { reactive } from vue;// ref用函数调用的方式生成响应式数据&#xff0c;可以传复杂和简单数据类型 import { ref } from vue // 简…

数据结构——排序第三幕(深究快排(非递归实现)、快排的优化、内省排序,排序总结)超详细!!!!

文章目录 前言一、非递归实现快排二、快排的优化版本三、内省排序四、排序算法复杂度以及稳定性的分析总结 前言 继上一篇博客基于递归的方式学习了快速排序和归并排序 今天我们来深究快速排序&#xff0c;使用栈的数据结构非递归实现快排&#xff0c;优化快排&#xff08;三路…

数字经济发展的新视角:数字产业化、数据资产化、产业数字化与数据产业

在当今数字化、网络化和智能化的时代&#xff0c;数字经济的快速发展催生了一系列新兴概念&#xff0c;其中“数字产业化、数据资产化、产业数字化与数据产业”尤为引人注目。这四个概念不仅代表了数字经济发展的不同阶段和方向&#xff0c;也深刻影响着传统产业的转型升级和经…

springboot370高校宣讲会管理系统(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 高校宣讲会管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c…

ansible自动化运维(一)配置主机清单

目录 一、介绍 1.1了解自动化运维 1.2 ansible简介 1.3 ansible自动化运维的优势 1.4 ansible架构图 二、部署ansible 2.1 基本参数 2.2 Ansible帮助命令 2.3 配置主机清单 2.3.1 查看ansible的所有配置文件 2.3.2 /etc/ansible/ansible.cfg常用配置选项 2.3.3 ssh密…

计算机网络 —— HTTP 协议(详解)

前一篇文章&#xff1a;网页版五子棋—— WebSocket 协议_网页可以实现websocket吗-CSDN博客 目录 前言 一、HTTP 协议简介 二、HTTP 协议格式 1.抓包工具的使用 2.抓包工具的原理 3.抓包结果 4.HTTP协议格式总结 三、HTTP 请求 1. URL &#xff08;1&#xff09;UR…

GaussDB的BTree索引和UBTree索引

目录 一、简介 二、BTree索引和UBTree索引结构 三、BTree索引和UBTree索引优势 四、总结与展望 一、简介 数据库通常使用索引来提高业务查询的速度。本文将深入介绍GaussDB中最常用的两种索引&#xff1a;BTree索引和UBTree索引。我们将重点解读BTree索引和UBTree索引的存储…

通义灵码走进北京大学创新课堂丨阿里云云原生 10 月产品月报

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 趋势热点 &#x1f947; 通义灵码走进北京大学创新课堂&#xff0c;与 400…

python 练习题

目录 1&#xff0c;输入三个整数&#xff0c;按升序输出 2&#xff0c;输入年份及1-12月份&#xff0c;判断月份属于大月&#xff0c;小月&#xff0c;闰月&#xff0c;平月&#xff0c;并输出本月天数 3&#xff0c;输入一个整数&#xff0c;显示其所有是素数因子 4&#…

IDEA 2024 配置Maven

Step 1:确定下载Apache Maven版本 在IDEA 2024中&#xff0c;随便新建一个Maven项目&#xff1b; 在File下拉菜单栏中&#xff0c;找到Setings&#xff1b; 在Build&#xff0c;Execution&#xff0c;Deployment中找到Maven 确定下载的Apache Maven版本应略低于或等于IDEA绑…

ubuntu20.04更换安装高版本CUDA以及多个CUDA版本管理

Ubuntu 20.04下多版本CUDA的安装与切换 CUDA安装配置环境变量软连接附上参考博客CUDA安装 cuda官方下载地址 因为我需要安装的是11.1版本的,所以这里按着11.1举例安装 安装命令如下: wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cu…

Web基础

实践目标 &#xff08;1&#xff09;Web前端HTML&#xff08;2&#xff09;Web前端javascipt&#xff08;3&#xff09;Web后端&#xff1a;MySQL基础&#xff1a;正常安装、启动MySQL&#xff0c;建库、创建用户、修改密码、建表&#xff08;4&#xff09;Web后端&#xff1a…

C++:unordered_map与unordered_set详解

文章目录 前言一、KeyOfT1. 为什么需要仿函数&#xff1f;2. MapKeyOfT与SetKeyOfT代码实现 二、迭代器1. 设计背景2. 为什么需要存储哈希表指针3. operator 的逻辑4. begin() 和 end() 的实现5. 友元和前置声明的作用6. 完整代码 三、迭代器map与set的复用1. map的复用&#x…

redis下载、基础数据类型、操作讲解说明,持久化、springboot整合等

1 Redis是什么 官网&#xff1a;https://redis.io 开发者&#xff1a;Antirez Redis诞生于2009年全称是Remote Dictionary Server 远程词典服务器&#xff0c;是一个基于内存的键值型NoSQL数据库。 Redis是一个开源的、高性能的键值对存储系统&#xff0c;它支持多种数据结构&…

《 C++ 修炼全景指南:二十五 》缓存系统的技术奥秘:LRU 原理、代码实现与未来趋势

摘要 本篇博客深入解析了 LRU&#xff08;Least Recently Used&#xff09;缓存机制&#xff0c;包括其核心原理、代码实现、优化策略和实际应用等方面。通过结合双向链表与哈希表&#xff0c;LRU 缓存实现了高效的数据插入、查找与删除操作。文章还对 LRU 的优化方案进行了详…

【k8s】给ServiceAccount 创建关联的 Secrets

说明 k8s v1.24.0 更新之后进行创建 ServiceAccount 不会自动生成 Secret 需要对其手动创建. 创建步骤 创建SA apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata:namespace: jtkjdevname: gitcicd-role rules: - apiGroups: ["apps"]resources: [&…

C++(4个类型转换)

1. C语言中的类型转换 1. 隐式 类型转换&#xff1a; 具有相近的类型才能进行互相转换&#xff0c;如&#xff1a;int,char,double都表示数值。 2. 强制类型转换&#xff1a;能隐式类型转换就能强制类型转换&#xff0c;隐式类型之间的转换类型强相关&#xff0c;强制类型转换…

Linux——命名管道及日志

linux——进程间通信及管道的应用场景-CSDN博客 文章目录 目录 文章目录 前言 一、命名管道是什么&#xff1f; 理解&#xff1a; 2、编写代码 makefile 管道封装成类&#xff0c;想用中管道时只需要调用实例化 读端 写端 日志 1、日志是什么&#xff1f; 2、日志有什么&#x…

动态代理如何加强安全性

在当今这个信息爆炸、网络无孔不入的时代&#xff0c;我们的每一次点击、每一次浏览都可能留下痕迹&#xff0c;成为潜在的安全隐患。如何在享受网络便利的同时&#xff0c;有效保护自己的隐私和信息安全&#xff0c;成为了每位网络使用者必须面对的重要课题。动态代理服务器&a…

5G学习笔记之随机接入

目录 1. 概述 2. MSG1 2.1 选择SSB 2.2 选择Preamble Index 2.3 选择发送Preamble的时频资源 2.4 确定RA-RNTI 2.5 确定发送功率 3. MSG2 4. MSG3 5. MSG4 6. 其它 6.1 切换中的随机接入 6.2 SI请求的随机接入 6.3 通过PDCCH order重新建立同步 1. 概述 随机接入…