news 2026/4/18 2:21:23

【C++篇】map和set的使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【C++篇】map和set的使用

本篇讲的map/set,其底层是红黑树,红黑树底层是一颗平衡二叉搜索树(具体可看之前的文章—二叉搜索树)。set是key搜索场景下的结构,map是key/value搜索场景下的结构。

2,set系列的使用

2.1,set类的介绍

代码语言:javascript

AI代码解释

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的声明如上,T就是set底层关键字(key)的类型。

set默认要求T是支持比较大小的,如果不支持或者想按自己的比较方式走,可以传仿函数给第二个模板参数。

set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参数

一般情况下是不需要传后两个参数的

set底层是用红黑树实现的,增删查的效率为O(logN),迭代器遍历走的是中序遍历,所以是有序的

2.2,set的构造和迭代器

代码语言:javascript

AI代码解释

//无参构造 explicit set (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());

代码语言:javascript

AI代码解释

//迭代器区间构造 template <class InputIterator> set (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& = allocator_type());

代码语言:javascript

AI代码解释

//initializer_list列表构造 其中value_type就是关键字key set (initializer_list<value_type> il, const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());

代码语言:javascript

AI代码解释

//拷贝构造 set (const set& x);

代码语言:javascript

AI代码解释

官方文档示例:

//迭代器是一个双向迭代器 iteratora bidirectional iterator to value_typeconvertible to const_iteratorconst_iteratora bidirectional iterator to const value_type

代码语言:javascript

AI代码解释

//正向迭代器 iterator begin() noexcept; const_iterator begin() const noexcept; iterator end() noexcept; const_iterator end() const noexcept;

//反向迭代器

代码语言:javascript

AI代码解释

reverse_iterator rbegin() noexcept; const_reverse_iterator rbegin() const noexcept;

代码语言:javascript

AI代码解释

reverse_iterator rend() noexcept; const_reverse_iterator rend() const noexcept;

set支持正向和反向迭代遍历,遍历默认按升序顺序,因为底层是⼆叉搜索树,迭代器遍历走的中 序;支持迭代器就意味着支持范围for,set的iterator和const_iterator都不支持迭代器修改数据,修改 关键字数据,破坏了底层搜索树的结构

2.3,set的增删查

//set中的key_type和value_type指的都是关键字key,它的类型是T key_type -> The first template parameter (T) value_type -> The first template parameter (T)

2.3.1,inset插入

// 单个数据插入,如果已经存在则插⼊失败

代码语言:javascript

AI代码解释

pair<iterator,bool> insert (const value_type& val);

// 列表插入,已经在容器中存在的值不会插入

代码语言:javascript

AI代码解释

void insert (initializer_list<value_type> il);

// 迭代器区间插入,已经在容器中存在的值不会插入

代码语言:javascript

AI代码解释

template <class InputIterator> void insert (InputIterator first, InputIterator last);

代码示例:

代码语言:javascript

AI代码解释

#include<iostream> #include<set> #include <string> 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); //迭代器遍历 auto it = s.begin(); while (it != s.end()) { cout << *it << " "; it++; } cout << endl; //重复的值不会插入 s.insert({ 2,8,3,9 }); for (auto e : s) { cout << e << " "; } cout << endl; //按ASCLL码大小比较 set<string> str = { "sort","insert","add" }; for (auto& e : str) cout << e << " "; cout << endl; return 0; }

2.3.2,find+erase

// 查找 val ,返回 val 所在的迭代器,没有找到返回 end()

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:20:45

Newsletter内容策划:每月精选功能更新与用户故事

CosyVoice3&#xff1a;开源声音克隆技术如何重塑个性化语音生成 在短视频平台每天诞生数百万条配音内容的今天&#xff0c;你是否曾好奇——那些语调自然、情绪饱满的“AI主播”&#xff0c;是如何用几秒钟就复刻出一个真实人声的&#xff1f;更进一步&#xff0c;如果只需一段…

作者头像 李华
网站建设 2026/4/18 3:16:06

DownKyi视频下载工具完全指南:轻松获取B站高清视频

DownKyi视频下载工具完全指南&#xff1a;轻松获取B站高清视频 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xff…

作者头像 李华
网站建设 2026/4/18 8:31:32

【工具】DeepWiki Devin|DeepWiki-open|自动为代码仓库生成图文并茂的详尽文档的网页工具

文章目录前言使用开源版本不开源版本注册生成仓库文档查看生成结果拓展脚本结语前言 我是在学习 libafl 的时候发现的这一个工具&#xff0c;我看不太懂它的 Qemu 的实现部分。然后一搜发现这个文档在整个搜索引擎的最上面点开之后&#xff0c;我发现它写的非常之详细&#xf…

作者头像 李华
网站建设 2026/4/18 8:10:03

混合精度推理实践:FP16加速而不损失音质

混合精度推理实践&#xff1a;FP16加速而不损失音质 在实时语音合成系统日益走向大众应用的今天&#xff0c;一个核心矛盾始终摆在开发者面前&#xff1a;如何在保证生成语音自然、清晰、富有情感的前提下&#xff0c;把模型推理延迟压到最低&#xff1f;尤其是在声音克隆这类对…

作者头像 李华
网站建设 2026/4/18 8:27:58

7大实用技巧:全面掌握NVIDIA显卡配置优化神器

7大实用技巧&#xff1a;全面掌握NVIDIA显卡配置优化神器 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector 是一款专为显卡配置优化而生的强大工具&#xff0c;它让用户能够深入…

作者头像 李华