当前位置: 首页 > news >正文

【C++ STL之map,set,pair详解】

目录

  • 一.map映射
    • 1.简介
    • 2.包含头文件及其初始化
    • 3.基本操作
    • 4.用迭代器正反遍历
    • 5.添加元素的四种方式
    • 6.元素的访问
    • 7.对比unordered_map,multimap
  • 二.set集合
    • 1.简介
    • 2.包含头文件及其初始化
    • 3.基本操作
    • 4.元素的访问
    • 5.set,multiset,unordered_set,unordered_multiset 比较
  • 三.pair二元组
    • 1.简介
    • 2.包含头文件及其初始化
    • 3.访问与修改

一.map映射

1.简介

在C++的STL(Standard Template Library)中,map是一个非常有用的关联容器。它提供了一种键-值对的数据结构,其中的元素按照键的顺序进行排序,并且每个键是唯一的。本文将详细介绍C++ STL中map的使用方法和一些常见操作。

2.包含头文件及其初始化

(1)头文件

#include <map>

(2)初始化方法
可以使用以下方式声明和初始化一个map对象:

map<KeyType, ValueType> myMap; // 声明一个空的map
map<string,string> mp;
map<string,int> mp;
map<int,node> mp;//node是结构体类型

也可以使用已有的键值对初始化map对象

std::map<KeyType, ValueType> myMap = {{key1, value1},{key2, value2},{key3, value3}
};

3.基本操作

代码含义
mp.find(key)返回键为key的映射的迭代器 注意:用find函数来定位数据出现位置,它返回一个迭代器。当数据存在时,返回数据所在位置的迭代器,数据不存在时,返回mp.end()
mp.erase(it)删除迭代器对应的键和值
mp.erase(key)根据映射的键删除键和值
mp.erase(first,last)删除左闭右开区间迭代器对应的键和值
mp.size()返回映射的对数
mp.clear()清空map中的所有元素
mp.insert()插入元素,插入时要构造键值对
mp.empty()如果map为空,返回true,否则返回false
mp.begin()返回指向map第一个元素的迭代器
mp.end()返回指向map尾部的迭代器(最后一个元素的下一个地址)
mp.rbegin()返回指向map最后一个元素的反向迭代器
mp.rend()返回指向map第一个元素前面(上一个)的反向迭代器(地址)
mp.count(key)查看元素是否存在,存在返回1,不存在返回0
mp.lower_bound()返回一个迭代器,指向键值>= key的第一个元素(只比较键)
mp.upper_bound()返回一个迭代器,指向键值> key的第一个元素(只比较键)

接下来将给出相对应代码来帮助理解
(1)使用insert()函数添加单个键值对:

myMap.insert(std::make_pair(key, value));

(2)使用下标运算符[ ]添加或更新键值对:

myMap[key] = value;

(3)使用erase()函数删除指定键的元素:

myMap.erase(key);

(4)使用find()函数查找指定键的元素,返回指向该元素的迭代器:

auto it = myMap.find(key);
if (it != myMap.end()) {// 找到了该键对应的元素ValueType value = it->second;
}

(5)使用lower_bound()函数查找大于等于指定键的第一个元素的迭代器:

auto it = myMap.lower_bound(key);
if (it != myMap.end()) {// 找到了大于等于指定键的第一个元素KeyType foundKey = it->first;ValueType foundValue = it->second;
}

(6)使用upper_bound()函数查找大于指定键的第一个元素的迭代器:

auto it = myMap.upper_bound(key);
if (it != myMap.end()) {// 找到了大于指定键的第一个元素KeyType foundKey = it->first;ValueType foundValue = it->second;
}

4.用迭代器正反遍历

(正向遍历)

map<int,int> mp;
mp[1] = 2;
mp[2] = 3;
mp[3] = 4;
auto it = mp.begin();
while(it != mp.end())
{cout << it->first << " " << it->second << "\n";it ++;
}

(反向遍历)

map<int,int> mp;
mp[1] = 2;
mp[2] = 3;
mp[3] = 4;
auto it = mp.rbegin();
while(it != mp.rend())
{cout << it->first << " " << it->second << "\n";it ++;
}

5.添加元素的四种方式

//先声明
map<string,string> mp;
mp["学习"] = "看书";//第一种
mp["玩耍"] = "打游戏";
mp.insert(make_pair("vegetable","蔬菜"));//第二种
mp.insert(pair<string,string>("fruit","水果"));//第三种
mp.insert({"hahaha","wawawa"});//第四种

6.元素的访问

(1)迭代器访问

int main() {std::map<int, std::string> myMap = {{1, "Alice"},{2, "Bob"},{3, "Charlie"}};// 使用迭代器进行遍历和访问for (auto it = myMap.begin(); it != myMap.end(); ++it) {int key = it->first;            // 访问键string value = it->second;     // 访问值cout << key << ": " << value << std::endl;}return 0;
}

(2)智能指针访问

for(auto i : mp)
cout << i.first << " " << i.second << endl;//键,值

(3)单个访问

map<char,int>::iterator it = mp.find('a');
cout << it -> first << " " <<  it->second << "\n";

(4)c++17特性才具有

for(auto [x, y] : mp)cout << x << " " << y << "\n";
//x,y对应键和值

7.对比unordered_map,multimap

1.map:map是一个有序的关联容器,其中的元素按照键的顺序进行排序。每个键是唯一的,不允许重复。map使用红黑树实现,插入和查找操作的时间复杂度为O(log n)。

2.unordered_map:unordered_map是一个无序的关联容器,其中的元素没有特定的顺序。每个键是唯一的,不允许重复。unordered_map使用哈希表实现,插入和查找操作的平均时间复杂度为O(1),最坏情况下为O(n)。(也是用哈希表实现)

3.multimap:multimap是一个有序的关联容器,其中的元素按照键的顺序进行排序。允许键重复,即可以有相同的键。multimap使用红黑树实现,插入和查找操作的时间复杂度为O(log n)。

4.unordered_multimap:unordered_multimap是一个无序的关联容器,其中的元素没有特定的顺序。允许键重复,即可以有相同的键。unordered_multimap使用哈希表实现,插入和查找操作的平均时间复杂度为O(1),最坏情况下为O(n)。
对比优劣:

(1)map和unordered_map都提供了快速的查找操作,但是在插入和删除操作上,unordered_map通常比map更快。

(2)unordered_map的元素没有特定的顺序,适用于不需要保持顺序的场景。而map的元素是有序的,适用于需要按照键的顺序进行访问的场景。

(3)multimap和unordered_multimap允许键重复,适用于需要存储相同键的场景。multimap保持元素的有序性,而unordered_multimap没有特定的顺序。

(4)在空间占用上,哈希表实现的容器(unordered_map和unordered_multimap)通常需要更多的内存,而红黑树实现的容器(map和multimap)通常需要较少的内存。

选择使用哪种容器取决于具体的需求。如果需要有序访问或者需要保持元素的有序性,可以选择map或multimap。如果对元素的顺序没有特定要求,但需要快速的插入和查找操作,可以选择unordered_map或unordered_multimap。

二.set集合

1.简介

在C++的STL(Standard Template Library)中,set是一个非常有用的关联容器。它提供了一种有序集合的数据结构,其中的元素按照键的顺序进行排序,并且每个键是唯一的。本文将详细介绍C++ STL中set的使用方法和一些常见操作。

2.包含头文件及其初始化

(1)头文件

#include <set>

(2)初始化

std::set<KeyType> mySet; // 声明一个空的set
std::set<KeyType> mySet = {element1, element2, element3};//也可以使用已有的元素初始化set对象:

3.基本操作

代码含义
s.begin()返回set容器的第一个元素的地址(迭代器)
s.end()返回set容器的最后一个元素的下一个地址(迭代器)
s.rbegin()返回逆序迭代器,指向容器元素最后一个位置
s.rend()返回逆序迭代器,指向容器第一个元素前面的位置
s.clear()删除set容器中的所有的元素,返回unsigned int类型
s.empty()判断set容器是否为空
s.insert()插入一个元素
s.size()返回当前set容器中的元素个数
erase(iterator)删除定位器iterator指向的值
erase(first,second)删除定位器first和second之间的值(左闭右开)
erase(key_value)删除键值key_value的值
s.find(元素)查找set中的某一元素,有则返回该元素对应的迭代器,无则返回end()
s.lower_bound(k)返回大于等于k的第一个元素的迭代器
s.upper_bound(k)返回大于k的第一个元素的迭代器访问

接下来将给出相对应代码来帮助理解

1.插入元素
mySet.insert(element);
mySet.insert(beginIterator, endIterator);2.删除元素
mySet.erase(value);
mySet.erase(beginIterator, endIterator);//注意左闭右开3.查找元素
auto it = mySet.find(value);
if (it != mySet.end()) {// 找到了该值对应的元素
}auto it = mySet.lower_bound(value);
if (it != mySet.end()) {// 找到了大于等于指定值的第一个元素
}auto it = mySet.upper_bound(value);
if (it != mySet.end()) {// 找到了大于指定值的第一个元素
}

4.元素的访问

(1)迭代器访问

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

(2)智能指针

for(auto i : s)cout<<i<<endl;

(3)访问最后一个元素

//第一种
cout<<*s.rbegin()<<endl;//第二种
set<int>::iterator iter = s.end();
iter--;
cout<<(*iter)<<endl; //打印2;//第三种
cout<<*(--s.end())<<endl;

5.set,multiset,unordered_set,unordered_multiset 比较

1.set:有序的关联容器,每个元素都是唯一的。使用红黑树实现,插入和查找的时间复杂度为O(log n)。元素按照键的顺序进行排序。

2.multiset:有序的关联容器,允许元素重复。使用红黑树实现,插入和查找的时间复杂度为O(log n)。元素按照键的顺序进行排序。

3.unordered_set:无序的关联容器,每个元素都是唯一的。使用哈希表实现,插入和查找的平均时间复杂度为O(1),最坏情况下为O(n)。元素没有特定的顺序。

4.unordered_multiset:无序的关联容器,允许元素重复。使用哈希表实现,插入和查找的平均时间复杂度为O(1),最坏情况下为O(n)。元素没有特定的顺序。

总结:
set和multiset是有序的,元素按照键的顺序进行排序,multiset允许元素重复。
unordered_set和unordered_multiset是无序的,元素没有特定的顺序,unordered_multiset允许元素重复。
set和unordered_set的查找和插入操作的时间复杂度较低,适用于需要快速查找和插入的场景。
multiset和unordered_multiset允许元素重复,适用于需要存储相同键的场景。
unordered_set和unordered_multiset在插入和查找操作上通常比set和multiset更快,但它们没有保持元素的有序性。

三.pair二元组

1.简介

在C++的STL(Standard Template Library)中,pair是一个非常有用的模板类。它提供了一种简单的方式来存储一对值,即键值对。pair可以用于各种场景,例如在容器中存储关联的数据,返回多个值等。本文将详细介绍C++ STL中pair的使用方法和一些常见操作。

2.包含头文件及其初始化

(1)头文件

#include <utility>

(2)初始化

pair<Type1, Type2> myPair; // 声明一个空的pair
pair<Type1, Type2> myPair(value1, value2); // 使用给定的值初始化pair
myPair = std::make_pair(value1, value2); // 使用make_pair函数创建pair并赋值

3.访问与修改

//定义结构体数组
pair<int,int>p[20];
for(int i = 0; i < 20; i++)
{//和结构体类似,first代表第一个元素,second代表第二个元素cout << p[i].first << " " << p[i].second;
}

pair可以作为容器(例如vector、list、map等)的元素使用。这样可以方便地存储和访问关联的数据。
下面是一个使用pair作为容器元素的示例代码:

int main() {vector<pair<int, string>> myVector;// 添加pair元素myVector.push_back(make_pair(1, "Alice"));myVector.push_back(make_pair(2, "Bob"));myVector.push_back(make_pair(3, "Charlie"));// 遍历输出pair元素for (const auto& pair : myVector) {cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;}return 0;
}

在上述示例代码中,我们创建了一个vector容器myVector,其中的元素是pair类型,包含一个整数和一个字符串。
然后,我们使用push_back()函数向容器中添加了一些pair元素。
最后,我们使用范围遍历来输出容器中的pair元素。

相关文章:

【C++ STL之map,set,pair详解】

目录 一.map映射1.简介2.包含头文件及其初始化3.基本操作4.用迭代器正反遍历5.添加元素的四种方式6.元素的访问7.对比unordered_map&#xff0c;multimap 二.set集合1.简介2.包含头文件及其初始化3.基本操作4.元素的访问5.set&#xff0c;multiset&#xff0c;unordered_set&am…...

Python LEGB规则解析与应用

引言 推荐阅读 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 资源分享 「java、python面试题」来自UC网盘app分享&#xff0c;打开手机app&#xff0c;额外获得1T空间 http…...

气象监测站:用科技感知气象变化

气象监测站是利用科学技术感知当地小气候变化情况的气象观测仪器&#xff0c;可用于农业、林业、养殖业、畜牧业、环境保护、工业等多个领域&#xff0c;提高对环境数据的利用率&#xff0c;促进产业效能不断提升。 气象监测站主要由气象传感器、数据传输系统、电源系统、支架…...

Linux debian12解压和压缩.rar文件教程

一、Debian12安装rar命令 sudo apt install rar二、使用rar软件 1.解压文件 命令格式&#xff1a; rar x 文件名.rar实例测试&#xff1a; [rootdoudou tmp]# rar x test.rar2.压缩文件 test是一个文件夹 命令格式&#xff1a; rar a 文件名.rar 文件夹名实例测试&#x…...

探析国际大文件传输的花费与降低开销的小妙招

随着全球化的不断发展&#xff0c;跨国企业日益增多&#xff0c;因此国外大文件传输也日益普遍。在这种背景下&#xff0c;国外大文件传输方式的需求也相应增加。本文旨在深入分析国外大文件传输的成本&#xff0c;并提出有效降低这些成本的方法。 一、国外大文件传输成本分析 …...

Linux中shell脚本——for、while循环及脚本练习

目录 一.for循环 1.1.基本格式 1.2.类C语言格式 二.while循环 2.1.基本格式 2.2.死循环语句 三.跳出循环 3.1.continue跳出循环 3.2.break跳出循环 四.常用循环 4.1.循环打印九九乘法表 4.2.循环ping测试某个网段网络连通性 4.3.while死循环实现猜数字游戏 4.4.数…...

【数字实验室】时钟切换

大部分开发者使用 BUFGCTRL 或 BUFGMUX进行时钟切换&#xff0c;它们在时钟切换上可以提供无毛刺输出。然而&#xff0c;了解所涉及的原理是有好处的。 当然&#xff0c;无论我们在同步逻辑中使用哪种技术&#xff0c;重要的是要确保在进行时钟切换时输出上没有毛刺。任何故障都…...

线性代数的学习和整理7:各种特殊效果矩阵特例(草稿-----未完成)

目录 1 矩阵 1.1 1维的矩阵 1.2 2维的矩阵 1.3 没有3维的矩阵---3维的是3阶张量 2 方阵 3 单位矩阵 3.1 单位矩阵的定义 3.2 单位矩阵的特性 3.3 为什么单位矩阵I是 [1,0;0,1] 而不是[0,1;1,0] 或[1,1;1,1] 3.4 零矩阵 3.4 看下这个矩阵 [0,1;1,0] 3.5 看下这个矩阵…...

springBoot 配置文件 spring.mvc.throw-exception-if-no-handler-found 参数的作用

在Spring Boot应用中&#xff0c;可以通过配置文件来控制当找不到请求处理器&#xff08;handler&#xff09;时是否抛出异常。具体的配置参数是spring.mvc.throw-exception-if-no-handler-found。 默认情况下&#xff0c;该参数的值为false&#xff0c;即当找不到请求处理器时…...

linux部署kafka3.5.1(单机)

一、下载jdk17 kafka3.x版本需要jdk11以上版本才能更好的兼容&#xff0c;jdk11、jdk17都是LTS长期维护版本&#xff0c;而且jdk17支持springboot3.x,所以我选择了openjdk17。 下载地址: Archived OpenJDK GA Releaseshttps://jdk.java.net/archive/ 二、上传jdk安装包解压 …...

css 实现svg动态图标效果

效果演示&#xff1a; 实现思路&#xff1a;主要是通过css的stroke相关属性来设置实现的。 html代码: <svgt"1692441666814"class"icon"viewBox"0 0 1024 1024"version"1.1"xmlns"http://www.w3.org/2000/svg"p-id"…...

软件测试项目实战,电商业务功能测试点汇总(全覆盖)

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

LeetCode[274]H指数

难度&#xff1a;Medium 题目&#xff1a; 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指…...

MyBatis-Plus快速开始[MyBatis-Plus系列] - 第482篇

悟纤&#xff1a;师傅&#xff0c;MyBatis-Plus被你介绍的这么神乎其乎&#xff0c;咱们还是来的点实际的吧。 师傅&#xff1a;那真是必须的&#xff0c;学习技术常用的一种方法&#xff0c;就是实践。 悟纤&#xff1a;贱贱更健康。 师傅&#xff1a;这… 师傅&#xff1a;…...

CF1003A Polycarp‘s Pockets 题解

题目传送门 题目意思&#xff1a; 给你 n n n 个数&#xff0c;求出最多相同的数的个数。 这道题目有两种解法。 方法一&#xff1a;桶排 一边输入&#xff0c;一边将第 i i i 个数 a i a_i ai​ 出现的次数存在一个数组 b b b 的第 a i a_i ai​ 个位置。输入完后遍历…...

数据库厂商智臾科技加入龙蜥社区,打造多样化的数据底座

近日&#xff0c;浙江智臾科技有限公司&#xff08;以下简称“智臾科技”&#xff09;正式签署 CLA 贡献者许可协议&#xff0c;加入龙蜥社区&#xff08;OpenAnolis&#xff09;。 智臾科技主创团队从 2012 年开始投入研发 DolphinDB。DolphinDB 作为一款基于高性能时序数据库…...

一天赚四五十的副业,可以试试这几种

大家都希望能够有额外的零花钱&#xff0c;尤其是对于学生和不收入稳定的人来说。今天&#xff0c;我将分享一些简单实用的赚钱技巧&#xff0c;帮助你每天赚取四五十的零花钱&#xff0c;让你的钱包更丰盈。 第一种&#xff1a;蚂蚁路客和友活来了 支付宝旗下两款接任务拍门…...

OpenCV 中的色彩空间 (C++ / Python)

在本教程中,我们将了解计算机视觉中使用的流行色彩空间,并将其用于基于颜色的分割。我们还将分享 C++ 和 Python 的演示代码。...

邀请函 | 高质量区块链·元宇宙—标准行系列沙龙(北京站)即将开启

区块链、元宇宙是近年来备受关注的新兴技术&#xff0c;也是推动数字经济发展的重要力量。高质量标准引领高质量发展&#xff0c;加快形成标准引领&#xff0c;充分释放区块链、元宇宙对实体经济牵引赋能效应&#xff0c;推进形成相关产业体系高质量发展新格局刻不容缓。 为进…...

php hmacsha256加密的算法

HMAC-SHA256是一种基于哈希算法的消息认证码算法&#xff0c;用于验证数据的完整性和真实性。它将密钥和数据一起进行哈希运算&#xff0c;生成一个固定长度的摘要值。只有知道密钥的人才能够验证该摘要值的真实性。 在PHP中&#xff0c;可以使用hash_hmac函数来计算HMAC-SHA2…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...