【C++】map与set容器的应用总结

当我们处理数据时,有时需要使用一些高效的数据结构来存储和管理元素。在C++中,我们有许多与此相关的容器类,如 树型结构:setmapmultisetmultimap; 哈希结构: unordered_setunordered_map。这些容器提供了不同的特性和适用性,下面我们将逐个介绍它们。

文章目录

  • 1. `set`:
  • 2. `map`:
  • 3. `multiset`:
  • 4. `multimap`:
  • 5. `unordered_set`:
  • 6. `unordered_map`:
  • 总结

1. set

set是一个有序的容器,它只包含唯一的元素。当我们需要存储一组元素,并确保没有重复值时,set是一个很好的选择。它基于红黑树实现,因此插入、删除和查找操作的时间复杂度都是O(log n)。set的元素按升序排列。

#include <iostream>
#include <set>
using namespace std;int main() {// 创建一个set容器set<int> mySet;// 插入元素mySet.insert(10);mySet.insert(20);mySet.insert(30);// 查找元素int key = 20;auto it = mySet.find(key);if (it != mySet.end()) {cout << key << " is found in the set." << endl; // 20 is found in the set.}else {cout << key << " is not found in the set." << endl; }// 删除元素mySet.erase(20);// 修改元素(set不支持直接修改元素值,需要先删除再插入)mySet.erase(10);mySet.insert(100);// 遍历输出set中的元素cout << "Set contains:";for (const auto& elem : mySet) {cout << " " << elem;}cout << std::endl; // Set contains : 30 100return 0;
}

对于set,可以在声明时传入自定义的比较函数或函数对象,来指定元素的排序规则。例如:

struct CustomCompare {bool operator() (int a, int b) const {// 自定义排序规则,这里以元素大小作为排序依据return a > b;}
};std::set<int, CustomCompare> mySet;

2. map

map是一个关联容器,它包含键值对(key-value)。每个键对应一个唯一的值,即每个键在map中是唯一的。map也是基于红黑树实现的,因此插入、删除和查找操作的时间复杂度都是O(log n)。

#include <iostream>
#include <map>
using namespace std;int main() {// 创建一个map容器,键为string类型,值为int类型map<string, int> myMap;// 插入键值对myMap["apple"] = 5;myMap["banana"] = 10;myMap["cherry"] = 15;// 查找元素string key = "banana";auto it = myMap.find(key);if (it != myMap.end()) {cout << key << " is found in the map with value: " << it->second << endl;// banana is found in the map with value : 10}else {std::cout << key << " is not found in the map." << std::endl;}// 删除元素myMap.erase("banana");// 修改元素myMap["cherry"] = 20;// 遍历输出map中的键值对cout << "Map contains:";for (const auto& pair : myMap) {cout << " (" << pair.first << ", " << pair.second << ")";}cout << endl; // Map contains : (apple, 5) (cherry, 20)return 0;
}

对于map,同样可以使用自定义的比较函数或函数对象来定义键的排序规则。例如:

struct CustomCompare {bool operator() (const std::string& a, const std::string& b) const {// 自定义排序规则,这里以字符串长度作为排序依据return a.length() < b.length();}
};std::map<std::string, int, CustomCompare> myMap;

3. multiset

multiset是一个有序的容器,它允许存储多个相同的元素。与set不同,multiset可以包含重复值。它也是基于红黑树实现的,因此插入、删除和查找操作的时间复杂度都是O(log n)。multiset的元素按升序排列。

4. multimap

multimap是一个关联容器,它允许存储多个相同的键值对。与map不同,multimap可以包含重复的键。它也是基于红黑树实现的,因此插入、删除和查找操作的时间复杂度都是O(log n)。

5. unordered_set

unordered_set是一个无序的容器,它包含唯一的元素。与set类似,unordered_set也用于存储一组唯一的值,但它使用哈希表来实现,因此插入、删除和查找操作的平均时间复杂度是O(1)。元素在容器中的位置并不固定。

6. unordered_map

unordered_map是一个关联容器,它包含键值对(key-value)。与map类似,unordered_map也用于存储键值对,但它使用哈希表来实现,因此插入、删除和查找操作的平均时间复杂度是O(1)。元素在容器中的位置并不固定。

总结

综上所述,选择使用哪种容器取决于具体的需求。如果需要有序性和快速查找,可以选择setmap;如果需要快速查找且不需要有序性,可以选择unordered_setunordered_map;如果需要允许重复元素或键,可以选择multisetmultimap

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

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

相关文章

如何使用ROS和easymqos快速搭建一辆语音控制导航的机器人

之前做的机器人小车基本都属于电脑或手机控制操作。目前&#xff0c;使用语音控制机器人小车运动&#xff0c;让机器人导航去指定地点&#xff0c;已经成为热门&#xff0c;并且语音识别技术已经有落地方案&#xff0c;可满足生活中的基本需要。有些语音芯片通过高算力处理器运…

openGauss学习笔记-244 openGauss性能调优-SQL调优-典型SQL调优点-统计信息调优

文章目录 openGauss学习笔记-244 openGauss性能调优-SQL调优-典型SQL调优点-统计信息调优244.1 统计信息调优244.1.1 统计信息调优介绍244.1.2 实例分析&#xff1a;未收集统计信息导致查询性能差 openGauss学习笔记-244 openGauss性能调优-SQL调优-典型SQL调优点-统计信息调优…

XDP学习笔记

XDP的使用与eBPF程序分不开&#xff0c;因此要了解学历XDP&#xff0c;须知道什么是eBPF、什么是XDP。 概念 eBPF BPF&#xff08;Berkeley Packet Filter&#xff09;是一种灵活且高效的数据包过滤技术&#xff0c;最初由 BSD Unix 中的网络子系统引入&#xff1b;BPF 允许用…

WebRTC:真正了解 RTP 和 RTCP

介绍 近年来&#xff0c;通过互联网进行实时通信变得越来越流行&#xff0c;而 WebRTC 已成为通过网络实现实时通信的领先技术之一。WebRTC 使用多种协议&#xff0c;包括实时传输协议 (RTP) 和实时控制协议 (RTCP)。 RTP负责通过网络传输音频和视频数据&#xff0c;而RTCP负责…

植物miRNA数据库PmiREN2.0的使用

前记 miRNA数据库是一个用于存储和分析microRNA&#xff08;miRNA&#xff09;序列和相关信息的数据库。miRNA是一类具有约20-24个核苷酸的非编码小RNA分子&#xff0c;通过调控基因表达来参与细胞生物学过程。miRNA数据库中通常包含miRNA序列、miRNA靶向基因、miRNA表达谱、m…

linux系统kubernetes下载可视化工具

kubernetes可视化工具的使用 可视化工具可视化工具的网站部署Kuboard部署Dashboard创建访问账号获取访问令牌浏览器访问 可视化工具 可视化工具的网站 kubesphere官网&#xff1a;https://kubesphere.io/zh/kuboard官网&#xff1a;https://kuboard.cn/install/v3/install-in…

以题为例浅谈文件包含

什么叫做文件包含 文件包含函数加载的参数没有经过过滤或严格定义&#xff0c;可以被用户控制&#xff0c; 包含其他恶意文件&#xff0c;导致了执行非预期代码。 文件包含漏洞&#xff08;File Inclusion Vulnerability&#xff09;是一种常见的网络安全漏洞&#xff0c;它允…

2023年总结:一个普通程序员如何挑选出价值千万的职业赛道

​​​​​​​ 引言 随着2023年的序幕缓缓落下&#xff0c;我终于在岁月的流转中捕捉到了一条隐秘而又公开的真理。它悄然告诉我们&#xff0c;成功并非单纯由勤劳的双手雕琢&#xff0c;一份耕耘未必有一份收获&#xff0c;而是在于我们如何在命运的十字路口作出关键选择。那…

Redis如何实现主从复制?主从复制的作用是什么?Redis集群是如何工作的?它有哪些优点和缺点?

Redis如何实现主从复制&#xff1f;主从复制的作用是什么&#xff1f; Redis的主从复制是一种数据复制机制&#xff0c;其中一个Redis实例作为主节点&#xff08;master&#xff09;&#xff0c;而其他Redis实例作为从节点&#xff08;slave&#xff09;。主从复制的实现过程如…

结构体联合体枚举和位段

文章目录 结构体结构体类型的声明特殊的声明 结构的自引用结构体变量的定义和初始化结构体内存对齐为什么要内存对齐结构体传参结构体实现位段&#xff08;位段的填充&可移植性&#xff09;位段位段的内存分配空间如何开辟位段的跨平台问题位段的应用 枚举枚举类型的定义枚…

重学SpringBoot3-整合SSM

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-整合SSM Spring Boot整合SSM示例1. 创建Spring Boot项目2. 配置数据源3. 配置MyBatis4. 实现数据访问对象&#xff08;DAO&#xff09;5. 编写服务层和控…

Linux-网络基础

目录 数据传输IP地址端口协议网络字节序网络通信--五元组 socket套接字编程udp、tcp区别udp通信程序的编写&#xff1a;套接字接口通信流程&#xff1a;接口代码 字节序转换接口代码实例 发展背景&#xff1a; 最早时期计算机是单机工作&#xff0c;由于两台主机之间无法进行信…

【C++庖丁解牛】List容器的介绍及使用 | 深度剖析 | list与vector的对比

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. list的介绍1.1 list的…

CentOS Stream9更改ip地址,网关(设置静态ip)

使用grep命令查询ens160文件所在的文件夹处 grep -rnw /etc -e ens160 然后用vi命令打开文件进行修改 vi /etc/NetworkManager/system-connections/ens160.nmconnection 配置&#xff1a; 假设将ip地址改为192.168.200.130 [connection] idens33 uuid0050f214-01a7-395e-…

环形链表2(C++), test ok

1. 题目 2. 思路分析&#xff1a; 与环形链表1一样&#xff0c;我们需要定义慢指针和快指针&#xff0c;确定链表是否有环&#xff0c;如果链表没有环的话&#xff0c;直接置空即可。如果链表有环&#xff0c;则需要向环形链表1一样&#xff0c;让快指针不断追赶慢指针&#x…

汽车电子零部件(4):行泊一体ADAS

前言: 现阶段智能汽车行业正在大规模力推无限接近于L3的L2++或L2.9自动驾驶量产落地,类似于当初智能手机替换传统手机的行业机会期。智能汽车常见的智能驾驶功能包括: 行车场景:自适应巡航控制ACC;自动变道辅助ALC;交通拥堵辅助TJA;车道居中LCC;领航辅助NOA; 泊车场…

每日一练:LeeCode-3、无重复字符的最长子串【滑动窗口+双指针】

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为无…

YOLOv9改进策略:注意力机制 | EMA:基于跨空间学习的高效多尺度注意力,效果优于ECA、CBAM、CA

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;加入EMA注意力&#xff0c;一种基于跨空间学习的高效多尺度注意力&#xff0c;效果优于ECA、CBAM、CA等经典注意力。 yolov9-c-EMA summary: 970 layers, 51011154 parameters, 51011122 gradients, 238.9 GF…

JavaScript 基础知识

一、初识 JavaScript 1、JS 初体验 JS 有3种书写位置&#xff0c;分别为行内、内部和外部。 示例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"wid…

pytorch 入门基础知识二(Pytorch 02)

一 微积分 1.1 导数和微分 微分就是求导&#xff1a; %matplotlib inline import numpy as np from matplotlib_inline import backend_inline from d2l import torch as d2l def f(x):return 3 * x ** 2 - 4 * x 定义&#xff1a; 然后求 f(x) 在 x 1 时的导数&#xff…