c++set和pair的使用
set
是C++中的一种关联容器,具有以下特点:
存储唯一元素(不允许重复)
元素自动排序(默认升序)
基于红黑树实现(平衡二叉搜索树)
插入、删除和查找的时间复杂度为O(log n)
前言
在C++标准模板库(STL)中,set
和pair
是两个非常重要且常用的组件。set
是一种关联式容器,提供高效的查找、插入和删除操作;pair
则是将两个值组合成一个单元的实用工具。本文将深入探讨它们的特性、用法以及实际应用场景。
1. pair
模板类详解
1.1 pair
的基本概念
pair
是 C++ 标准模板库中的一个实用模板类,定义在 <utility>
头文件中。它将两个值组合成一个单元,这两个值可以是相同或不同的类型。
#include <utility> // 包含pair的定义
#include <iostream>
using namespace std;int main() {// 创建pair的三种方式pair<int, string> p1(1, "Apple"); // 直接构造auto p2 = make_pair(2, "Banana"); // 使用make_pair函数pair<int, string> p3 = {3, "Orange"}; // C++11统一初始化// 访问pair的成员cout << "p1: " << p1.first << ", " << p1.second << endl;cout << "p2: " << p2.first << ", " << p2.second << endl;cout << "p3: " << p3.first << ", " << p3.second << endl;return 0;
}
pair<T1, T2>
模板接受两个类型参数 first
和 second
是pair的两个公有成员,用于访问存储的值 make_pair
可以自动推导类型,比直接构造更简洁
1.2 pair
的比较操作
pair支持比较运算符,按照字典序进行比较:先比较first,如果first相等再比较second。
pair<int, int> a(1, 2);
pair<int, int> b(1, 3);
pair<int, int> c(2, 1);cout << boolalpha;
cout << (a < b) << endl; // true (1==1, 2<3)
cout << (a < c) << endl; // true (1<2)
cout << (b < c) << endl; // true (1<2)
2. set
容器详解
set
的构造和初始化
#include <iostream>
#include <set>
using namespace std;int main() {// 空setset<int> s1;// 初始化列表(C++11)set<int> s2 = {3, 1, 4, 1, 5}; // 实际存储1,3,4,5// 使用数组范围初始化int arr[] = {2, 4, 6, 4, 2};set<int> s3(arr, arr + 5); // 存储2,4,6// 拷贝构造set<int> s4(s3);// 输出set内容cout << "s2: ";for(int num : s2) cout << num << " ";cout << "\ns3: ";for(int num : s3) cout << num << " ";return 0;
}
set
会自动去重和排序 可以使用数组指针作为迭代器范围初始化 基于范围的for循环可以方便地遍历set
set
的常用操作
插入元素
set<string> fruits;
fruits.insert("Apple");
fruits.insert("Banana");
fruits.insert("Orange");// 检查插入是否成功
auto ret = fruits.insert("Apple"); // 尝试重复插入
if(!ret.second) {cout << "Apple already exists in set" << endl;
}
删除元素
// 通过值删除
fruits.erase("Banana");// 通过迭代器删除
auto it = fruits.find("Orange");
if(it != fruits.end()) {fruits.erase(it);
}// 删除范围
set<int> nums = {1, 2, 3, 4, 5};
nums.erase(nums.find(2), nums.find(4)); // 删除[2,4)
查找元素
set<int> s = {10, 20, 30, 40, 50};// 使用find()
auto it = s.find(30);
if(it != s.end()) {cout << "Found: " << *it << endl;
}// 使用count()
if(s.count(25) > 0) {cout << "25 exists" << endl;
} else {cout << "25 doesn't exist" << endl;
}
如果找到元素:返回指向该元素的迭代器 如果找不到元素:返回 s.end()
,即指向 set
末尾的迭代器(不指向任何有效元素)。
set
与 pair
的结合使用
// 使用pair作为set的元素
set<pair<int, string>> studentScores;
studentScores.insert({90, "Alice"});
studentScores.insert({85, "Bob"});
studentScores.insert({95, "Charlie"});// 遍历
for(const auto& entry : studentScores) {cout << entry.second << ": " << entry.first << endl;
}/*
输出:
Bob: 85
Alice: 90
Charlie: 95
*/
性能对比
操作 | 时间复杂度 | 说明 |
---|---|---|
insert() | O(log n) | 插入元素并保持有序 |
erase() | O(log n) | 删除元素 |
find() | O(log n) | 查找元素 |
count() | O(log n) | 检查元素是否存在 |
size() | O(1) | 获取元素数量 |
empty() | O(1) | 检查是否为空 |
pair
、set
和 map
的联系与区别
特性 | std::pair | std::set | std::map |
---|---|---|---|
元素类型 | 任意两种类型的组合 | 单一类型 | pair<const Key, Value> |
元素数量 | 固定两个成员(first和second) | 动态变化 | 动态变化 |
排序方式 | 无排序 | 按元素值排序 | 按键排序 |
唯一性 | 不适用 | 元素值唯一 | 键唯一 |
访问方式 | 直接访问.first和.second | 通过迭代器 | 通过键或迭代器 |
查找效率 | 不适用 | O(log n) | O(log n) |
插入操作 | 直接构造 | insert()/emplace() | insert()/emplace()/operator[] |
典型应用场景 | 多返回值、map元素 | 需要唯一且有序的集合 | 键值对关联存储 |
内存结构 | 连续存储两个成员 | 树状结构 | 树状结构 |
修改限制 | 两个成员都可修改 | 元素不可修改(只能删除后插入) | 键不可修改,值可修改 |
std::set
的 "元素值唯一"
含义:set
中存储的每个元素值都必须是唯一的,不能有重复。
std::set<int> numbers = {1, 2, 2, 3}; // 实际存储:{1, 2, 3}
底层机制:set
在插入新元素时,会检查是否已存在相同的值。如果存在,则不会插入。
std::map
的 "键唯一"
含义:map
中每个元素的键(key)必须是唯一的,但值(value)可以重复
std::map<std::string, int> ages = {{"Alice", 25},{"Bob", 25}, // 值可以重复{"Alice", 30} // 键重复!第二个 "Alice" 会覆盖第一个
};
两个键 "Alice"
冲突时,后者会覆盖前者的值(最终 "Alice"
对应 30
)。值 25
可以重复出现(如 "Alice"
和 "Bob"
的值都是 25
)
总结
pair
和 set
是C++ STL中非常重要的两个组件:
pair 用于将两个值组合成一个单元 set
用于维护一个唯一、有序的集合
它们可以单独使用,也可以结合使用(例如 set<pair<T1, T2>>
)。理解它们的特性和正确使用方式,可以大大提高C++编程的效率和质量。
相关文章:
c++set和pair的使用
set是C中的一种关联容器,具有以下特点: 存储唯一元素(不允许重复) 元素自动排序(默认升序) 基于红黑树实现(平衡二叉搜索树) 插入、删除和查找的时间复杂度为O(log n) 前言 在C…...
数据库中间件ShardingSphere5
一、高性能架构模式 数据库集群,第一种方式“读写分离”,第二种方式“数据库分片”。 1.1 读写分离架构 读写分离原理:将数据库读写操作分散到不同的节点上。 读写分离的基本实现: 主库负责处理事务性的增删改操作,…...
window显示驱动开发—使用状态刷新回调函数
用户模式显示驱动程序可以使用 Direct3D 运行时版本 10 State-Refresh回调函数 来实现无状态驱动程序或构建命令缓冲区前导数据。 Direct3D 运行时在调用 CreateDevice (D3D10 ) 函数时,向D3D10DDIARG_CREATEDEVICE结构的 pUMCallbacks 成员指向的D3D10DDI_CORELAY…...
windows11右击恢复为windows10
文章目录 前言一、问题描述二、解决方案 前言 为了解决win11的右击更多选项的问题 一、问题描述 win11的右键更多选项过于繁琐 二、解决方案 在windows11的终端管理员中输入如下代码: reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c…...
基于物联网的智能衣柜系统设计
标题:基于物联网的智能衣柜系统设计 内容:1.摘要 随着物联网技术的飞速发展,智能家居领域迎来了新的变革机遇。本研究的目的在于设计一种基于物联网的智能衣柜系统,以提升用户的衣物管理和使用体验。方法上,通过搭建物联网硬件平台ÿ…...
GM DC Monitor v2.0 卸载教程
以下俩种方法任选一种均可 第一种方法:一键自动卸载 进入到软件安装目录 卸载app 进入到app目录,运行一键卸载脚本:sh uninstall.sh 卸载es 进入到es目录,运行一键卸载脚本:sh uninstall.sh 卸载db 进入到db目录&a…...
C#上位机实现报警语音播报
我们在开发C#上位机时,有时候会需要将报警信息通过语音进行播报,今天跟大家分享一下具体的实现过程。 一、组件安装 首先我们创建好一个Windows窗体项目,然后添加System.Speech库引用。 点击引用,右击添加引用,在程…...
python自助棋牌室管理系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
榕壹云婚恋相亲系统:ThinkPHP+UniApp打造高效婚配平台
引言 在数字化浪潮下,婚恋相亲行业正加速向线上迁移。榕壹云公司基于市场需求与技术积累,开发一款功能完备、技术开源的婚恋相亲小程序系统,为单身人士提供高效、安全的婚恋平台。本文将围绕系统背景、客户定位、核心技术、功能模块及优势场景展开详细解析,助力开发者与技…...
每日leetcode
2890. 重塑数据:融合 - 力扣(LeetCode) 题目 DataFrame report --------------------- | Column Name | Type | --------------------- | product | object | | quarter_1 | int | | quarter_2 | int | | quarter_3 | i…...
深入理解XGBoost(何龙 著)学习笔记(五)
深入理解XGBoost(何龙 著)学习笔记(五) 本文接上一篇,内容为线性回归,介绍三部分,首先介绍了"模型评估”,然后分别提供了线性回归的模型代码:scikit-learn的Linear…...
SelectDB 在 AWS Graviton ARM 架构下相比 x86 实现 36% 性价比提升
在海量数据分析中,追求高性价比已成为各大企业的主流趋势。ARM 架构凭借其高能效和低成本的特点,逐渐在数据中心崛起,成为理想的高性价比选择。基于 ARM 架构的 AWS Graviton 系列处理器,正是这一趋势的典型代表。Graviton 处理器…...
机器学习流量识别(pytorch+NSL-KDD+多分类建模)
本文主要实现以下功能,会提供完整的可运行的代码以及解释为什么这么设计。文章不会收费,若被限制查看,请私信我。 使用 NSL-KDD 数据集的CSV文件进行流量攻击检测,使用机器学习算法实现流量攻击检测,使用pytorch框架…...
三种经典算法无人机三维路径规划对比(SMA、HHO、GWO三种算法),Matlab代码实现
代码功能 该MATLAB代码用于对比三种元启发式优化算法(SMA、HHO、GWO三种算法, SMA黏菌算法、HHO哈里斯鹰优化算法、GWO灰狼优化算法) 在特定优化问题上的性能,运行环境MATLABR2020b或更高 : 初始化问题模型ÿ…...
FTTR+软路由网络拓扑方案
文章目录 网络拓扑软路由配置FTTR光猫路由器TPLink路由器配置WAN设置LAN设置 参考 网络拓扑 软路由配置 配置静态IP地址:192.168.1.100设置网关指向主路由的IP 设置自定义DNS服务器 开启DHCP 这一步很关键,可以让连上wifi的所有设备自动趴强。 FTTR光猫…...
服务器获取外网IP,并发送到钉钉
服务器获取外网IP,并发送到钉钉 import time import hmac import hashlib import base64 import urllib.parse import requests# 请填入你的钉钉机器人配置 access_token XXXX secret XXXX# 获取公网 IP def get_public_ip():try:response requests.get("…...
解决uni-app发布微信小程序主包大小限制为<2M的问题
一 问题说明 我想用uniapp开发多端应用,引入了uview组件库来美化样式,可发布为微信小程序却提示我代码质量不过关,主包代码量太大了: 二 问题分析 2.1 原生微信小程序开发代码质量限制: 1.主包代码大小不得大于2M&…...
魅族“换血”出牌:手机基本盘站不稳,想靠AI和汽车“改命”
撰稿|何威 来源|贝多财经 被吉利收购后,魅族逐渐转向在AI领域躬身耕作。 自2024年2月以“All in AI”正式宣告转型、喊出不再推出传统智能手机的豪言开始,这家曾以设计见长的手机厂商,将下半场押注在AI终端、AR眼镜与智能座舱系统上&#…...
原点安全入选 Gartner®“数据安全平台”中国市场指南代表厂商
2025年1月7日,全球权威咨询与分析机构 Gartner 发布《中国数据安全平台市场指南》(China Context: ‘Market Guide for Data Security Platforms’),北京原点数安科技有限公司(简称“原点安全”,英文名称&q…...
uni-app-配合iOS App项目开发apple watch app
假设你已经用uni-app开发好了一个iOS端的app,现在想要开发一个配套的apple watch app。改怎么去开发呢?是不是一头雾水,这篇文章就会介绍一些apple watch app开发的知识以及如何在uni-app开发的iOS app基础上去开发配套的watch app。 一、ap…...
如何理解Java反射机制
反射机制原理 反射是Java在运行时动态获取类信息、操作类属性和方法的能力。核心原理是JVM在类加载时创建Class对象,该对象包含类的完整结构信息。 关键类: Class:类的元数据入口 Field:类的成员变量 Method:类的方…...
SM3算法C语言实现(无第三方库,带测试)
一、SM3算法介绍 SM3算法是中国国家密码管理局(OSCCA)于2010年发布的商用密码散列函数标准,属于我国自主设计的密码算法体系之一 ,标准文档下载地址为:SM3密码杂凑算法 。SM3算法输出长度为256位(32字节&a…...
King’s LIMS 系统引领汽车检测实验室数字化转型
随着汽车保有量的持续攀升和车龄的增长,消费者对汽车的需求已悄然转变,从最初对外观和性能的追求,逐渐深化为对安全性、可靠性、耐久性、性能与舒适性以及智能化功能的全方位关注。这无疑让汽车检测行业在保障车辆质量、满足市场需求方面肩负…...
CppCon 2017 学习:Mocking Frameworks Considered
当然可以,下面是对 Fowler 的 Whiskey-Store 示例。 Fowler 的 Whiskey-Store 示例(坏设计) 贴出的类图是 Martin Fowler 在《重构》书中使用的一个教学用反面案例(故意设计得不合理),用来说明如何通过重…...
通过事件过滤器拦截QRadioButton点击事件
通过事件过滤器拦截QRadioButton点击事件 一、事件过滤器完整实现 1. 核心代码扩展(含注释) bool MainWindow::eventFilter(QObject* obj, QEvent* ev) {// 拦截所有QRadioButton的鼠标事件(包括点击、释放、双击)if (ev->ty…...
领码 SPARK 融合平台赋能工程建设行业物资管理革新——数智赋能,重塑中国模式新范式
摘要 工程建设行业正加速迈向数字化与精益化转型,物资管理成为项目成败的关键瓶颈。本文深入解析中国工程企业“项目部-物资部-企业项目管理部”三级协同的独特物资管理体系,聚焦集中采购与零星采购的统筹难题。基于领码 SPARK 融合平台,提出…...
“地标界爱马仕”再启:世酒中菜联袂陈汇堂共筑新会陈皮顶奢产业
“地标界爱马仕”再启战略新篇:世酒中菜联袂陈汇堂,共筑新会陈皮顶奢产业生态 ——中世国际与陈汇堂股权合作签约仪式在国际地理标志服务基地举行 江门市新会区,2025年6月20日——被誉为“地标界爱马仕”的全球顶奢品牌运营商世酒中菜 &…...
.Net Framework 4/C# 数据访问技术(ADO.NET)
一、数据库基础 (一) 数据库简介 数据库是按照数据结构来组织、存储和管理数据的仓库,是存储在一起的相关数据的集合。 (二) SQL 语言简介 SQL 是一种数据库查询和程序设计语言,用于存取数据以及查询,更新和管理关系型数据库系统。在编写 SQL 语句时,SQL 语句各关键字要以…...
北京京东,看看难度
最近由于三大外卖平台“打仗”,优惠券多到数不过来,一日三餐每个平台各点一单哈哈哈,正好最近组织内部还有朋友在北京的京东面试过,分享一下她的面经(Java岗): 1. Kafka消息不丢失问题…...
RPGMZ游戏引擎 如何手动控制文字显示速度
直接上代码 const _Window_Base_prototype_initialize Window_Base.prototype.initialize;Window_Base.prototype.initialize function(rect) {_Window_Base_prototype_initialize.call(this, rect);this.文字速度缓冲 0;}; this.文字速度缓冲 0; 进行缓冲 Window_Base…...
linux线程同步
互斥锁 同步与互斥概述** 现代操作系统基本都是多任务操作系统,即同时有大量可调度实体在运行。在多任务操作系统中,同时运行的多个任务可能: 都需要访问/使用同一种资源 多个任务之间有依赖关系,某个任务的运行依赖于另一个任…...
大内存对电脑性能有哪些提升
在科技飞速发展的今天,电脑已经成为我们生活和工作中不可或缺的伙伴。无论是日常办公、追剧娱乐,还是进行复杂的游戏和专业设计,电脑的性能都至关重要。而在影响电脑性能的众多因素中,内存大小常常被人们忽视。 多任务处理更流畅…...
什么是“微博养铁粉”以及如何增加微博铁粉
发了个发微博养铁工具_微博养铁粉的定义 微博养铁粉是指粉丝通过与博主的互动,成为博主的铁粉。铁粉是微博推出的一种反映粉丝与博主之间亲密度的互动产品。成为铁粉后,粉丝的评论权重增加,更容易上前排,点赞和评论的效果也会更好…...
华为和H3C服务器配置远控管理地址
1、华为RH2288_V3服务器 1.1、启动服务器按DEL按键进入服务器bios 1.2、选择Advanced菜单中的 IPMI iBMC Configuration配置项回车进入。 1.3、IPMI iBMC Configuration配置界面中选择IBMC Configuration配置项回车进入。 1.4、IBMC Configuration 配置项中配置IPV4 Configura…...
Git 查询与切换分支的完整指南
Git 查询与切换分支的完整指南 1. 查询分支列表 查看本地分支 git branch当前分支会以绿色显示并带有 * 标记添加 -v 或 -vv 查看更详细的信息(最后一次提交和跟踪关系) git branch -v # 或者 git branch -vv查看所有分支(包括远程分支&a…...
Spring 中的依赖注入(DI)详解
📌 摘要 在现代 Java 开发中,依赖注入(Dependency Injection, DI) 是 Spring 框架最核心的功能之一。它通过解耦对象之间的依赖关系,提高了代码的可维护性、可测试性和可扩展性。 本文将全面讲解 Spring 中依赖注入的…...
Bytebase 3.7.1 - 数据库变更功能全免费!
🔔 重大变更 所有数据库变更相关功能现已在社区版中完全免费开放!详情请查看我们的最新定价。 🎄 改进 文档网站全面升级,改进导航、搜索功能,以及与 AI 集成自助回答问题。SQL 编辑器现在会高亮光标所在的语句。SQ…...
深度学习笔记27-LSTM实现糖尿病探索与预测(Pytorch)
🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 一、前期准备 1.数据导入 import torch.nn as nn import torch.nn.functional as F import torchvision,torch import numpy as np import pandas as pd impo…...
3DS中文游戏全集下载 任天堂3DS简介3DS第一方独占游戏推荐
任天堂3DS 的详细介绍,涵盖其硬件特性、核心功能、游戏阵容及历史地位: 3DS游戏全集下载 https://pan.quark.cn/s/dd40e47387e7 https://sink-698.pages.dev/3ds CIA CCA 等格式可用于3DS模拟器和3DS实体机 3DS 是什么? 全称:Nin…...
vue3 reactive重新赋值
在 Vue 3 中,如果你想使用 reactive API 来创建一个响应式对象,并且之后需要更新这个对象中的属性,你可以按照以下步骤进行: 1. 使用 reactive 创建响应式对象 首先,你需要从 Vue 的 reactive API 中创建一个响应式对…...
全面掌握 C++ 基础:关键特性与进化
文章目录 全面掌握 C 基础:关键特性与进化1. C 关键字2. 命名空间(namespace)⚠️ 示例 2.1 定义命名空间2.2 使用成员的方法 3. C 输入/输出(iostream)4. 缺省参数(Default Parameter)4.1 定义…...
HTML一键打包EXE串口API介绍
HTML一键打包EXE软件(HTML转EXE) 支持将Web前端项目转换为Windows平台下的独立可执行程序(EXE),适用于Windows 7及以上系统,无需额外配置系统环境, 软件包含多种内核, 包括IE内核, Chrome内核, 以及WebView2(永久免费), 适用于不同…...
.docx 和 .doc 都是 Word 文档格式的区别
.docx 和 .doc 都是 Word 文档格式,但有区别: .docx 是新版 Word 格式(推荐使用) 从 Microsoft Word 2007 起引入的格式全名是:Office Open XML Document实际是一个 压缩包(ZIP)结构࿰…...
如何轻松地将音乐从 iPhone 传输到 Mac?
想把音乐从 iPhone 传输到 Mac 吗?这很常见,无论你是想更换设备、备份收藏,还是只想在更大的屏幕上欣赏喜爱的歌曲。幸运的是,有 6 种有效的方法可以完成这项工作,具体取决于你喜欢使用的工具。让我们开始吧。 第 1 部…...
Qwen3 Embedding 结构-加载-训练 看透模型设计哲学
看透一个顶级AI句向量模型的设计秘密,从文件结构到加载原理,再到其背后的训练哲学。 1 Qwen3-Embedding模型结构拆解 说明:目录包含了运行一个基于 Transformer 的句向量模型所需的所有组件 文件类别核心文件作用核心模型model.safetensors…...
AT8548双通道 H 桥电机驱动芯片
AT8548 是一种双通道低饱和电压的正、反向电机驱动芯片,为玩具、打印机和其它电机一体化应用提供一种双通道电机驱动方案。 特点: 双通道H桥电机驱动器; 驱动两个直流有刷电机或者一个步进电机; 低RDS(ON)电阻,1.06Ω(…...
kubeadm worker节点加入master失败
文章目录 1、操作2、问题现象3、问题原因4、问题解决4.1、重新生成token4.2、重新生成hash值 5、验证 1、操作 执行以下命令,让worker节点加入到master节点 kubeadm join 103.123.222.241:6443 --token vxe3v1.wzpnks8v1vbbtsu0 --discovery-token-ca-cert-hash s…...
Maven 之工程化开发核心指南:插件配置、pom 文件与依赖管理
目录 1. 🧩Maven插件 2. 🏗️构建Maven工程 3. 📄 pom文件配置 3.1. ⚙️ 中定义一些配置信息 3.2. 📦 中定义依赖的jar包坐标 3.3. 🔌 中定义第三方插件 4. ✍️编写代码 5. 🔗依赖范…...
分布式系统中的 Kafka:流量削峰与异步解耦(二)
Kafka 在分布式系统中的应用案例 电商订单系统 在电商领域,订单系统是核心业务模块之一,涉及多个复杂的业务环节和系统组件之间的交互。以常见的电商购物流程为例,当用户在电商平台上下单后,订单创建服务会首先接收到用户的订单…...
从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页
如果php.ini已经加入了如下的内容还是报错 : upload_max_filesize 1024M post_max_size 1024M 那就是因为阿帕奇导致:...