24.C++进阶:set|构造|迭代器|增删查|multiset|OJ

序列式容器和关联式容器

STL中的部分容器如:string、vector、list、deque、array、forward_list等,这些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间⼀般没有紧密的关联关系,⽐如交换⼀下,他依旧是序列式容器。顺序容器中的元素是按他们在容器中的存储位置来顺序保存和访问的。
关联式容器也是⽤来存储数据的,与序列式容器不同的是,关联式容器逻辑结构通常是⾮线性结构,两个位置有紧密的关联关系,交换⼀下,他的存储结构就被破坏了。顺序容器中的元素是按关键字来保存和访问的。关联式容器有map/set系列和unordered_map/unordered_set系列。
map和set底层是红⿊树,红⿊树是⼀颗平衡⼆叉搜索树。set是key搜索场景的结构,map是key/value搜索场景的结构。

set系列的使⽤

set和multiset参考⽂档

参考文档

set类的介绍
  • set的声明如下,T就是set底层关键字的类型
  • set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模版参数
  • set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参数。
  • ⼀般情况下,我们都不需要传后两个模版参数。
  • set底层是⽤红⿊树实现,增删查效率是O(logN) ,迭代器遍历是⾛的搜索树的中序,所以是有序的。
template < class T, // set::key_type/value_type class Compare = less<T>, // set::key_compare/value_compare class Alloc = allocator<T> // set::allocator_type > class set;
set的构造和迭代器

set的构造我们关注以下⼏个接⼝即可。
set的⽀持正向和反向迭代遍历,遍历默认按升序顺序,因为底层是⼆叉搜索树,迭代器遍历⾛的中序;⽀持迭代器就意味着⽀持范围for,set的iterator和const_iterator都不⽀持迭代器修改数据,修改关键字数据,破坏了底层搜索树的结构。

// empty (1) ⽆参默认构造 explicit set (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type()); // range (2) 迭代器区间构造 template <class InputIterator> set (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& = allocator_type()); // copy (3) 拷⻉构造 set (const set& x); // initializer list (5) initializer 列表构造 set (initializer_list<value_type> il, const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type()); // 迭代器是⼀个双向迭代器 iterator -> a bidirectional iterator to const value_type // 正向迭代器 iterator begin(); iterator end(); // 反向迭代器 reverse_iterator rbegin(); reverse_iterator rend();
set的增删查
Member types key_type -> The first template parameter (T) value_type -> The first template parameter (T) // 单个数据插⼊,如果已经存在则插⼊失败 pair<iterator,bool> insert (const value_type& val); // 列表插⼊,已经在容器中存在的值不会插⼊ void insert (initializer_list<value_type> il); // 迭代器区间插⼊,已经在容器中存在的值不会插⼊ template <class InputIterator> void insert (InputIterator first, InputIterator last); // 查找val,返回val所在的迭代器,没有找到返回end() iterator find (const value_type& val); // 查找val,返回Val的个数 size_type count (const value_type& val) const; // 删除⼀个迭代器位置的值 iterator erase (const_iterator position); // 删除val,val不存在返回0,存在返回1 size_type erase (const value_type& val); // 删除⼀段迭代器区间的值 iterator erase (const_iterator first, const_iterator last); // 返回⼤于等val位置的迭代器 iterator lower_bound (const value_type& val) const; // 返回⼤于val位置的迭代器 iterator upper_bound (const value_type& val) const;
insert和迭代器遍历使⽤样例
#include<iostream> #include<set> using namespace std; int main() { // 去重+升序排序 set<int> s; // 去重+降序排序(给⼀个⼤于的仿函数) //set<int, greater<int>> s; s.insert(5); s.insert(2); s.insert(7); s.insert(5); //set<int>::iterator it = s.begin(); auto it = s.begin(); while (it != s.end()) { // error C3892: “it”: 不能给常量赋值 // *it = 1; cout << *it << " "; ++it; } cout << endl; // 插⼊⼀段initializer_list列表值,已经存在的值插⼊失败 s.insert({ 2,8,3,9 }); for (auto e : s) { cout << e << " "; } cout << endl; set<string> strset = { "sort", "insert", "add" }; // 遍历string⽐较ascll码⼤⼩顺序遍历的 for (auto& e : strset) { cout << e << " "; } cout << endl; }
find和erase使⽤样例
#include<iostream> #include<set> using namespace std; int main() { set<int> s = { 4,2,7,2,8,5,9 }; for (auto e : s) { cout << e << " "; } cout << endl; // 删除最⼩值 s.erase(s.begin()); for (auto e : s) { cout << e << " "; } cout << endl; // 直接删除x int x; cin >> x; int num = s.erase(x); if (num == 0) { cout << x << "不存在!" << endl; } for (auto e : s) { cout << e << " "; } cout << endl; // 直接查找在利⽤迭代器删除x cin >> x; auto pos = s.find(x); if (pos != s.end()) { s.erase(pos); } else { cout << x << "不存在!" << endl; } for (auto e : s) { cout << e << " "; } cout << endl; // 算法库的查找 O(N) auto pos1 = find(s.begin(), s.end(), x); // set⾃⾝实现的查找 O(logN) auto pos2 = s.find(x); // 利⽤count间接实现快速查找 cin >> x; if (s.count(x)) { cout << x << "在!" << endl; } else { cout << x << "不存在!" << endl; } return 0; }
#include<iostream> #include<set> using namespace std; int main() { std::set<int> myset; for (int i = 1; i < 10; i++) myset.insert(i * 10); // 10 20 30 40 50 60 70 80 90 for (auto e : myset) { cout << e << " "; } cout << endl; // 实现查找到的[itlow,itup)包含[30, 60]区间 // 返回 >= 30 auto itlow = myset.lower_bound(30); // 返回 > 60 auto itup = myset.upper_bound(60); // 删除这段区间的值 myset.erase(itlow, itup); for (auto e : myset) { cout << e << " "; } cout << endl; return 0; }
multiset和set的差异

multiset和set的使⽤基本完全类似,主要区别点在于multiset⽀持值冗余,那么insert/find/count/erase都围绕着⽀持值冗余有所差异

#include<iostream> #include<set> using namespace std; int main() { // 相⽐set不同的是,multiset是排序,但是不去重 multiset<int> s = { 4,2,7,2,4,8,4,5,4,9 }; auto it = s.begin(); while (it != s.end()) { cout << *it << " "; ++it; } cout << endl; // 相⽐set不同的是,x可能会存在多个,find查找中序的第⼀个 int x; cin >> x; auto pos = s.find(x); while (pos != s.end() && *pos == x) { cout << *pos << " "; ++pos; } cout << endl; // 相⽐set不同的是,count会返回x的实际个数 cout << s.count(x) << endl; // 相⽐set不同的是,erase给值时会删除所有的x s.erase(x); for (auto e : s) { cout << e << " "; } cout << endl; return 0; }
349. 两个数组的交集 - 力扣(LeetCode)
class Solution { public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { set<int> s1(nums1.begin(), nums1.end()); set<int> s2(nums2.begin(), nums2.end()); // 因为set遍历是有序的,有序值,依次⽐较 // ⼩的++,相等的就是交集 vector<int> ret; auto it1 = s1.begin(); auto it2 = s2.begin(); while(it1 != s1.end() && it2 != s2.end()) { if(*it1 < *it2) { it1++; } else if(*it1 > *it2) { it2++; } else { ret.push_back(*it1); it1++; it2++; } } return ret; } };
142. 环形链表 II - 力扣(LeetCode)

数据结构初阶阶段,我们通过证明⼀个指针从头开始⾛⼀个指针从相遇点开始⾛,会在⼊⼝点相遇,理解证明都会很⿇烦。这⾥我们使⽤set查找记录解决⾮常简单⽅便,这⾥体现了set在解决⼀些问题时的价值,完全是降维打击。

class Solution { public: ListNode *detectCycle(ListNode *head) { set<ListNode*> s; ListNode* cur = head; while(cur) { auto ret = s.insert(cur); if(ret.second == false) return cur; cur = cur->next; } return nullptr; } };

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

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

相关文章

基于大数据爬虫+Hadoop的新闻媒体内容推荐与热点话题分析系统开发任务书

一、任务名称 基于大数据爬虫Hadoop的新闻媒体内容推荐与热点话题分析系统开发 二、任务目的 当前新闻媒体行业进入数字化转型深水区&#xff0c;信息过载与内容同质化问题突出&#xff0c;用户难以快速获取精准感兴趣的内容&#xff0c;媒体平台也缺乏对热点话题的实时捕捉、深…

25.C++进阶:map|pair类型|构造|增删查|数据修改|迭代器|multimap|OJ

map系列的使⽤ map和multimap参考⽂档 参考文档 map类的介绍 map的声明如下&#xff0c;Key就是map底层关键字的类型&#xff0c;T是map底层value的类型&#xff0c;set默认要求Key⽀持⼩于⽐较&#xff0c;如果不⽀持或者需要的话可以⾃⾏实现仿函数传给第⼆个模版参数&am…

2026出差旅行充电宝品牌实力解码:安全派与实用派产品的用户评价与场景案例复盘 - 品牌推荐

随着全球商务与休闲旅行活动的全面复苏,出差旅行已成为现代职场与生活的重要组成部分。据统计,2025年中国商旅市场规模已恢复并超越疫情前水平,而作为差旅“续命神器”的充电宝,其市场需求也呈现出专业化、场景化的…

文件时间属性修改神器,绝了

有的时候需要对文件的时间属性进行修改&#xff0c;例如文件的创建时间、访问时间和或者最后的修改时间。 但是Windows系统里面自带的工具没有办法修改这些参数&#xff0c;需要借助第三方软件。今天给大家推荐两款非常强大的软件&#xff0c;可以帮助修改文件时间。 JD Design…

2026年1月出差旅行充电宝选购指南:附最新TOP5品牌综合测评榜单 - 品牌推荐

随着《2026中国商旅安全与效率装备白皮书》的发布,出差旅行充电宝市场正从单纯追求容量与快充,进入一个强调场景化安全、智能管理与隐私防护的加速分化新阶段。与此同时,商务人士关于“出差充电宝哪个品牌更安全”、…

基于机器学习的大学生求职系统开发任务书

基于机器学习的大学生求职系统开发任务书 一、任务名称 基于机器学习的大学生求职系统开发 二、任务目的 当前大学生求职市场呈现“信息过载、供需错配、精准度不足”的痛点&#xff0c;大学生难以快速筛选适配自身能力与职业规划的岗位&#xff0c;企业也面临优质应届生挖掘…

展厅装修公司怎么选?2026年关注这几点避坑,展览/展厅制作/展台设计/展位搭建/展位布置/展馆设计,展厅装修公司排行 - 品牌推荐师

评测背景 随着全球会展经济的复苏,企业展厅作为品牌展示的核心场景,其装修质量直接影响市场竞争力。然而,市面展厅装修公司服务水平参差不齐,部分企业存在设计同质化、落地执行低效、售后维护缺失等问题。为此,第…

AWS ML Specialist 考试备考指南

AWS ML Specialist 考试备考指南 一、考试核心信息 (一)考试基本信息考试名称:AWS Certified Machine Learning - Specialty(AWS机器学习专家认证) 考试形式:线上机考(Pearson VUE监考)/ 线下考点机考 考试时长…

2025年国内诚信的电环厂商如何选,帽式滑环/编码器滑环/气路滑环/导电滑环/电滑环/过孔导电滑环,电环供应厂家排行 - 品牌推荐师

随着智能装备、工业自动化、新能源等领域的快速发展,电环(导电滑环)作为关键传动部件,其性能直接影响设备运行的稳定性与效率。然而,国内电环市场长期存在“低价竞争、同质化严重”的困境,部分厂商以牺牲质量换取…

【SSM毕设源码分享】基于SSM+vue的专业课程教学过程管理系统的教师模块[的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2026锯铣分板机源头工厂排名,EXE亿协的技术创新亮点 - 工业品牌热点

2026年电子制造产业加速向智能化、精密化转型,锯铣分板机作为PCBA制程中的核心设备,其性能稳定性、加工精度与成本控制直接决定下游企业的生产效率与产品良率。无论是3C电子、汽车电子还是医疗器械领域,选择优质的锯…

Python Flask 多文件任务打包部署(Linux+Docker+Windows 全环境)

Python Flask 多文件任务打包部署(Linux+Docker+Windows 全环境)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

AI音轨分离|Demucs上手指南

1. 认识Demucs:音频分离的革命性工具 Demucs是由Meta(Facebook)AI Research开发的开源音频源分离工具,它采用先进的深度学习技术,能够将完整的音乐曲目分离成不同的音轨成分,如人声、鼓点、贝斯和其他伴奏。与传…

树莓派PiPico BadUSB 教程

树莓派PiPico BadUSB 教程 安装 CircuitPython for Pi Pico 过程省略 添加adafruit_hid库到Lib文件夹 过程省略 核心模块说明模块 用途usb_hid.devices 获取已连接的 HID 设备列表(通常只有 1 个)adafruit_hid.keybo…

【SSM毕设全套源码+文档】基于SSM的商城系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【SSM毕设全套源码+文档】基于SSM的手机商城管理系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【SSM毕设源码分享】基于SSM+vue的学生作业管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【小程序毕设全套源码+文档】基于微信小程序的大学生体检预约小程序设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2026年诚信的商业美陈,新年美陈,互动美陈公司选购参考名录 - 品牌鉴赏师

《2026年诚信的商业美陈、新年美陈、互动美陈公司选购参考名录》引言在商业美陈、新年美陈以及互动美陈行业蓬勃发展的当下,如何挑选一家优质、诚信的美陈公司成为众多企业和商家关注的焦点。为了给广大客户提供客观、…

最新知名的非标钣金定制产品选哪家,非标钣金定制源头厂家哪个好技术领航,品质之选 - 品牌推荐师

随着制造业向智能化、定制化方向加速转型,非标钣金定制市场迎来爆发式增长。据行业数据显示,2024年国内非标钣金市场规模突破1200亿元,年复合增长率达12%,但市场集中度不足15%,企业间技术实力、交付能力与服务质量…