C++中map和set的使用

在这里插入图片描述(图片来源于网络)

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻强烈推荐优质专栏: 🍔🍟🌯C++的世界(持续更新中)
🐻推荐专栏1: 🍔🍟🌯C语言初阶
🐻推荐专栏2: 🍔🍟🌯C语言进阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>:讲解C++中的新容器,set与map对于常用的接口介绍。
金句分享:
✨人攀明月不可得,月行却与人想随。✨

目录

  • 一、set
  • 1.1 set特点介绍
  • 1.2 set使用
    • 1.21 构造函数
    • 1.22 升/降序
    • 1.23 其他接口
      • (1) **容量(`capacity`)相关:**
      • (2)**Modifiers(修改)**
      • (3)**查找**
  • 二、map
  • 2.1 map的特点介绍
    • 2.2 map的使用
      • ✨构造函数
      • 🍔[ ]的作用
  • 三、实例
    • 🍭两个数组的交集
    • 🍔单词识别

一、set

1.1 set特点介绍

set的介绍
C++中的set是一个STL容器,它是一个自动排序的集合(即将数据存入set,我们通过迭代器顺序访问出来时,数据是有序的),内部使用红黑树(后面会讲解)来实现。它的特点是不允许重复元素,而且插入元素时自动进行排序。

set容器的特点

  1. 存入set后数据有序: set是按照一定次序存储元素的容器,迭代器迭代出来的数据是有序的。
  2. 数据唯一(可以用于去重):每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
  3. set在底层是用二叉搜索树(红黑树)实现的。
    注意:
  4. set中查找某个元素,时间复杂度为: l o g 2 n log_2 n log2n,因为底层是红黑树。

1.2 set使用

1.21 构造函数

在这里插入图片描述
(来源于:官方文档)

测试构造:

	//测试构造void test_Construct() {set<int> s1;//普通构造//迭代器构造//数组int arr[] = { 2,2,1,1,5,5,5,1,7,9,8,10 };set<int> s2(arr,arr+sizeof(arr)/sizeof(int));    //默认就是升序cout << "s2: ";for (auto it : s2) {cout << it << " ";}cout << endl;//vectorvector<int> v = { 2,2,1,1,5,5,5,1,7,9,8,10 };set<int> s3(v.begin(), v.end());    //默认就是升序cout << "s3: ";for (auto it : s3) {cout << it << " ";}cout << endl;//拷贝构造set<int> s4(s3);cout << "s4: ";for (auto it : s3) {cout << it << " ";}cout << endl;
}

运行结果:

s2: 1 2 5 7 8 9 10
s3: 1 2 5 7 8 9 10
s4: 1 2 5 7 8 9 10

1.22 升/降序

void test_cmp() {//set 降序set<int, less<int>> s1;s1.insert(3);s1.insert(5);s1.insert(2);s1.insert(6);s1.insert(7);s1.insert(10);s1.insert(9);s1.insert(1);s1.insert(4);s1.insert(8);cout << "升序:s1: ";for (auto it : s1) {cout << it << " ";}cout << endl;//set升序set<int, greater<int>> s2;s2.insert({3,5,2,6,7,10,9,1,4,8});cout << "降序:s2: ";for (auto it : s2) {cout << it << " ";}cout << endl;
}

运行结果:

升序:s1: 1 2 3 4 5 6 7 8 9 10
降序:s2: 10 9 8 7 6 5 4 3 2 1

1.23 其他接口

(1) 容量(capacity)相关:

接口名介绍
empty( )检测set是否为空,空返回true,否则返回false
size()获取set中有效数据的个数

(2)Modifiers(修改)

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

接口名解释
insert向set中插入数据,可以是迭代器区间们也可以是单个的值
erase删除指定位置的数据(可以提供迭代器,也可以是元素值)
void swap (set& x);交换两个set
void clear();清除set中的数据

(3)查找

接口名解释
iterator find (const value_type& val) const;查找元素 ,返回该元素的迭代器
size_type count (const value_type& val) const;返回目标元素在set中出现的次数(由于set是不予讯重复元素的,所以这个接口意义不大)
	void test() {set<int, greater<int>> s1;s1.insert({ 3,5,2,6,7,10,9,1,4,8 });cout << "有效数据的个数: " << s1.size() << endl;cout << "是否为空容器:  " << s1.empty() << endl;//在set中意义不大的函数cout << "容器中元素3出现了:  " << s1.count(3) << endl;set<int>:: iterator it = s1.find(2);        //找到则返回这个元素的迭代器,没找到,则返回end()cout <<"find(2): "<< * it << endl;set<int, greater<int>> s2;s2.insert({ 1,5,8 });cout << "交换前:"<<endl;cout << "s1: ";for (auto it : s1) {cout << it << " ";}cout << endl;cout << "s2: ";for (auto it : s2) {cout << it << " ";}cout << endl;swap(s1, s2);cout << "交换后:" << endl;cout << "s1: ";for (auto it : s1) {cout << it << " ";}cout << endl;cout << "s2: ";for (auto it : s2) {cout << it << " ";}cout << endl;s1.clear();cout << "清除:s1: ";for (auto it : s1) {cout << it << " ";}cout << endl;
}

运行结果:

有效数据的个数: 10
是否为空容器: 0
容器中元素3出现了: 1
find(2): 2
交换前:
s1: 10 9 8 7 6 5 4 3 2 1
s2: 8 5 1
交换后:
s1: 8 5 1
s2: 10 9 8 7 6 5 4 3 2 1
清除:s1:

二、map

2.1 map的特点介绍

map是一个关联容器,它提供了一种存储键值对的方法。它是按照键(key)进行排序和存储的,键必须是唯一的,而值(value)可以重复。map通常使用红黑树实现,所以它的查找、插入和删除操作的时间复杂度都是O(log n)。

那么何为键值对?
键值对是一种常用的数据存储结构,由“键”和“值”两部分组成。其中,“键”是唯一的,用于标识数据,而“值”则是与键相关联的数据。
其实很简单,例如: {“apple”, “苹果”}

下面是pair大概实现:

template <typename T1, typename T2> 
struct pair {T1 first;		//键T2 second;		//值pair() : first(), second() {}pair(const T1& x, const T2& y): first(x), second(y) {}template <typename U1, typename U2>pair(const pair<U1, U2>& p) : first(p.first), second(p.second) {}pair& operator=(const pair& rhs) {if (this != &rhs) {first = rhs.first;second = rhs.second;}return *this;}
};

2.2 map的使用

在这里插入图片描述
mapset的用法基本相同,只不过一个是键值对,一个是单个的值。
这里对于map就不过多介绍了。

✨构造函数

	void test_map() {// 构造空的mapmap<string, int> map1;cout << "map1:" << endl;for (auto it : map1) {cout << it.first << it.second << endl;}cout << endl;// 使用初始化列表构造map<string, string> map2{{"apple", "苹果"},{"banana", "香蕉"},{"orange", "橘子"}};cout << "map2:" << endl;for (auto it : map2) {cout << it.first << it.second << endl;}cout << endl;// 构造map并插入元素map<string, int> map3;map3.insert(pair<string, int>("panda", 1));map3.insert(make_pair("", 2));map3.insert(map<string, int>::value_type("monkey", 3));cout << "map3:" << endl;for (auto it : map3) {cout << it.first << it.second << endl;}cout << endl;cout << "空格对应的值:" << map3[""];
}

运行结果:

map1:

map2:
apple苹果
banana香蕉
orange橘子

map3:
2
monkey3
panda1

空格对应的值:2

🍔[ ]的作用

在这里插入图片描述

C++ 中,map 中的 [] 运算符可以用于访问和修改 map 中的元素,其作用如下:

  1. 若键值存在,返回对应的值;
  2. 若键值不存在,会与这个不存在的key和默认值构成一个键值对,自动插入默,并返回该默认值的引用。
	void test() {std::map<std::string, int> my_map;my_map["apple"] = 2;my_map["banana"] = 3;cout << "my_map 变化前" << endl;for (auto it : my_map) {cout << it.first << " : " << it.second << endl;}cout << endl;std::cout << my_map["apple"] << std::endl; // 输出 2std::cout << my_map["pear"] << std::endl;  // 输出默认值 0cout << "my_map 变化后" << endl;for (auto it : my_map) {cout << it.first << " : " << it.second << endl;}cout << endl;}

运行结果:

my_map 变化前
apple : 2
banana : 3

2
0
my_map 变化后
apple : 2
banana : 3
pear : 0

在这里插入图片描述

注意map可以通过[key]访问对应的value

关于map,本篇就主要介绍这[ ]接口了。

三、实例

🍭两个数组的交集

(1)关于set的示例使用:
set在oj题中的应用
题目名称:两个数组的交集
题目链接: 传送门
(声明:题目来源于“力扣”)

题目描述
给定两个数组 nums1nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
在这里插入图片描述

解题思路:
将两个数组分别进set中去重得到s1s2,然后将其中一个与另一个比较,判断是否存在则是交集。

示例代码:

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {vector<int> ret;    //用于返回结构的数组//先通过set去重set<int> s1;for(int& it:nums1){s1.insert(it);}set<int> s2;for(int& it:nums2){s2.insert(it);}for(auto& it:s1){if(s2.count(it)){    //表示s1中的值在s2中可以找到ret.push_back(it);}}return ret;}
};

🍔单词识别

(2)关于map的使用

题目描述:
输入一个英文句子,把句子中的单词(不区分大小写)按出现次数按从多到少把单词和次数在屏幕上输出来,次数一样的按照单词小写的字典序排序输出,要求能识别英文单词和句号。

在这里插入图片描述

  1. 由于不区分大小写,可以先将字符串中所有的字母转化为小写。
  2. 将字符串按照空格划分,划分为一个个单词word。
  3. 将单词存入map,没出现一次单词,该单词的次数就+1;
  4. 最后按迭代器跑一遍即可。

示例代码:

#include <iostream>
#include <vector>
#include <map>
#include <string>
using namespace std;int main() {string sentence;getline(cin, sentence);//全部转化为小写for (auto& it : sentence) {if (it >= 'A' && it <= 'Z') {it += 32;}}auto left = sentence.begin();auto right = left;map<string, int, less<string>> m;for (int i = 0; i < sentence.size(); i++) {right = sentence.begin();if (sentence[i] == ' ' || sentence[i] == '.'){right += i;string word(left, right);left = right + 1;m[word]++;}}for (auto& it : m) {cout << it.first << ":" << it.second << endl;}return 0;
}

在这里插入图片描述

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

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

相关文章

力扣算法-Day20

541. 反转字符串II 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个&#xff0c…

【yaml 文件使用】pytest+request 框架中 yaml 配置文件使用

又来进步一点点~~ 背景&#xff1a;最近在学习pytestrequest框架写接口测试自动化&#xff0c;使用yaml文件配置更方便管理用例中的数据&#xff0c;这样更方便 yaml 介绍&#xff1a; 什么是 yaml 文件&#xff1a;YAML 是 “YAML Ain’t a Markup Language”&#xff08;Y…

一、对人工智能大模型了解与认知

黑8说 月黑风高&#xff0c;乌云密布&#xff0c;树木低垂&#xff0c;黯淡沉闷。这黎明前的风暴&#xff0c;预示着新时代的变革即将到来。 在一个8线小城市的办公室中 黑8对主任说&#xff1a; 世界上有男人、女人、人妖&#xff0c;米国有1/3男&#xff0c;2/3女…&#xff…

黑马程序员JavaWeb开发|Maven高级

一、分模块设计与开发 分模块设计&#xff1a; 将项目按照功能拆分成若干个子模块&#xff0c;方便项目的管理维护、扩展&#xff0c;也方便模块间的相互调用&#xff0c;资源共享。 注意&#xff1a;分模块开发需要先对模块功能进行设计&#xff0c;再进行编码。不会先将工…

比较两组相同构造结构的迭代次数

( A, B )---9*50*2---( 1, 0 )( 0, 1 ) 做一个网络分类A和B&#xff0c;让B全是0&#xff0c;让训练集A中只有9张图片&#xff0c;共有4个点。共有16种情况 迭代次数 迭代次数 1 - - - - - - - 1 9252.186 1 1 1 - - - - - - - 49334.66 9 1 - - - …

十款数据可视化工具横评:优缺点大揭秘

作为一位热衷于数据可视化的爱好者&#xff0c;我深知选择一款得心应手的数据可视化工具对于呈现数据的魅力至关重要。在市面上众多的数据可视化工具中&#xff0c;我精选了十款备受瞩目的产品&#xff0c;下面就为大家简单介绍一下它们的优缺点&#xff0c;以帮助大家进行选择…

区块空间----流动性铭文

铭文正在改变加密世界&#xff0c;越来越多的人开始关注铭文&#xff0c;并参与进来&#xff01;铭文赛道的未来是非常具有潜力和想象力的&#xff0c;甚至能够达到加密货币的普及水平。当然&#xff0c;这需要更多的基础设施更多的用例支持&#xff0c;但是一切都才刚刚开始。…

数据库之 基础概念、安装mysql、sql语句基础

数据库之 基础概念、安装mysql、sql语句基础 【一】存储数据的演变过程&#xff1a; 文件存储&#xff1a; 初始阶段随意存放数据到文件&#xff0c;格式任意。目录规范引入&#xff1a; 软件开发使用目录规范&#xff0c;限制数据位置&#xff0c;建立专门文件夹。本地数据存…

单片机学习笔记---独立按键控制LED状态

上一节学习的是独立按键控制LED亮灭 这一节我们先来讲一下按键的抖动&#xff1a; 对于机械开关&#xff0c;当机械触点断开、闭合时&#xff0c;由于机械触点的弹性作用&#xff0c;一个开关在闭合时不会马上稳定地接通&#xff0c;在断开时也不会一下子断开&#xff0c;所以…

基于51单片机智能电子秤

实物显示效果&#xff1a; https://www.bilibili.com/video/BV1Wb4y1A7Aw/?vd_source6ff7cd03af95cd504b60511ef9373a1d 功能介绍&#xff1a; &#xff08;1&#xff09;用键盘设计单价&#xff1b; &#xff08;2&#xff09;称重后同时显示该物品的重量、单价和总额&…

大创项目推荐 题目:基于大数据的用户画像分析系统 数据分析 开题

文章目录 1 前言2 用户画像分析概述2.1 用户画像构建的相关技术2.2 标签体系2.3 标签优先级 3 实站 - 百货商场用户画像描述与价值分析3.1 数据格式3.2 数据预处理3.3 会员年龄构成3.4 订单占比 消费画像3.5 季度偏好画像3.6 会员用户画像与特征3.6.1 构建会员用户业务特征标签…

VR漫游:赋予用户720度身临其境的沉浸式体验

如今&#xff0c;VR全景技术已经成为了千行百业中不可或缺的一部分&#xff0c;随着用户对交互式、沉浸式体验的需求不断加强&#xff0c;VR漫游逐渐取代了传统图片&#xff0c;为人们带来了流畅且完整的VR宣传观看体验。 VR实景漫游真实的展示了现场环境&#xff0c;不仅增加了…

JavaEE 网络编程

JavaEE 网络编程 文章目录 JavaEE 网络编程引子1. 网络编程-相关概念1.1 基本概念1.2 发送端和接收端1.3 请求和响应1.4 客户端和服务端 2. Socket 套接字2.1 数据包套接字通信模型2.2 流套接字通信模型2.3 Socket编程注意事项 3. UDP数据报套接字编程3.1 DatagramSocket3.2 Da…

【C语言/数据结构】排序(直接插入排序|希尔排序)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​​ 目录 插入排序 直接插入排序&…

Fink CDC 1.0 至3.0的从古至今

本文主要分享Flink CDC 1.0 至3.0的发展历程,了解其背后的关键特性和发展趋势,探讨其在大数据领域的影响和价值。 一、CDC概述 CDC是一种用以掌控数据变化的软件架构(技术思路),用于捕获和传递数据库中发生的数据变化。当数据库中发生增(INSERT)/删(DELETE)/改(UPD…

Java实现数字化社区网格管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、开发背景四、系统展示五、核心源码5.1 查询企事业单位5.2 查询流动人口5.3 查询精准扶贫5.4 查询案件5.5 查询人口 六、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的数字化社区网格管理系统&#xf…

燃烧的指针(三)

&#x1f308;个人主页&#xff1a;小田爱学编程 &#x1f525; 系列专栏&#xff1a;c语言从基础到进阶 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于c语言的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x…

【AndroidStudio】2022.3Giraffe连接超时,更换下载源,使用本地gradle,版本对应问题

记录了使用AndroidStudio2022.3 Giraffe版本在搭建环境时遇到的问题&#xff0c;包括连接超时&#xff0c;gradle无法读取等。 如果只看如何正确的配置&#xff0c;直接跳转第3节 配置汇总 1 连接超时 项目一开始会自动下载gardle文件来加载项目 1.1 Connect timed out 基…

算法38:子数组的最小值之和(力扣907题)----单调栈

题目&#xff1a; 给定一个整数数组 arr&#xff0c;找到 min(b) 的总和&#xff0c;其中 b 的范围为 arr 的每个&#xff08;连续&#xff09;子数组。 示例 1&#xff1a; 输入&#xff1a;arr [3,1,2,4] 输出&#xff1a;17 解释&#xff1a; 子数组为 [3]&#xff0c;[…

go语言(十八)---- goroutine

一、goroutine package mainimport ("fmt""time" )func main() {//用go创建承载一个形参为空&#xff0c;返回值为空的一个函数go func() {defer fmt.Println("A.defer")func() {defer fmt.Println("B.defer")//退出当前goroutinefmt…