要 set 还是 map? 我全要

news2024/9/20 19:44:20

引子:

时隔多日,我又回来啦,接上回,我们讲到set的一小部分,我们今天来讲详细讲set与map,满满干货启动!根据应用场景的不同,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。

扩展:序列的稳定性:在稳定的排序算法中,‌如果两个元素的值相等,‌它们在排序后的位置与排序前的相对顺序保持不变。‌例如,‌冒泡排序和插入排序是稳定的排序算法,‌而快速排序、‌选择排序和堆排序则是不稳定的。‌

pair的引入:

pair是C++ STL中定义的一个模板类,用于存储一对值,

用途pair常用于函数返回两个值的场景,或者作为键值对存储在某些容器中

pair对象支持比较操作符,如==, !=, <, >, <=, >=,这些操作符首先比较.first成员,如果相等,则比较.second成员

成员访问pair对象提供了访问其两个元素的方法,通常使用.first.second来分别访问第一个和第二个元素

对于set来说为pair<迭代器,bool>,对于map来说是pair<key,value>
set利用pair.second的:判断带环链表的入环点或是否带环等问题

map利用pair对应的second,可以做英文字典的查找,门禁卡等工作

什么是set?

总的来说有以下几点:

  1. 元素唯一性:set中的每个元素都是唯一的,不允许重复。如果尝试添加一个已经存在的元素,大多数情况下,这个操作会被忽略。

  2. 无序性:虽然你提到了"按照一定次序存储元素",但实际上大多数编程语言中的set并不保证元素的存储顺序。它们通常不按照元素的添加顺序或任何特定的顺序来存储元素。

  3. 元素作为键:在某些编程语言中,如C++的std::set,元素既是键也是值,因为set是基于键值对的集合,但键和值是相同的。

  4. 不可修改性:set中的元素通常是不可修改的,即一旦元素被添加到set中,就不能更改它的值。但是,你可以删除元素,然后重新插入一个新的元素。

  5. 基于红黑树的实现:在某些实现中,set可能使用红黑树来维护元素的有序性,这允许set在对数时间内进行查找、插入和删除操作。但是,并非所有set的实现都使用红黑树,有些可能使用哈希表。

  6. 类型为T:set可以存储任何类型的元素,只要这些元素支持比较操作,以便确定它们在set中的顺序(在基于红黑树的实现中)。

  7. 常量元素:在某些语言中,set中的元素被视为常量,意味着你不能更改它们,但可以添加或删除。

set的一些常用函数:

  1. empty():检查集合是否为空。

  2. size():返回集合中元素的数量。

  3. clear():移除集合中的所有元素。

  4. insert(value):向集合中插入一个新的元素。如果元素已存在,则不执行插入操作。

  5. erase(value):从集合中删除特定的元素。也可以删除指定范围内的元素。

  6. find(value):查找集合中是否存在特定值的元素,如果存在,返回指向该元素的迭代器;如果不存在,返回end()迭代器。

  7. count(value):返回集合中具有特定值的元素数量,对于set,这个函数总是返回0或1。

  8. lower_bound(value):返回指向大于或等于指定值的第一个元素的迭代器。

  9. upper_bound(value):返回指向大于指定值的第一个元素的迭代器。

  10. equal_range(value):返回一个范围,包含所有等于指定值的元素。对于set,这个范围由lower_boundupper_bound返回的迭代器界定。

  11. begin():返回指向集合开始的迭代器。

  12. end():返回指向集合结束(最后一个元素之后)的迭代器。

  13. rbegin():返回指向集合逆向开始的迭代器。

  14. rend():返回指向集合逆向结束的迭代器。

  15. swap(set):交换当前集合的内容与另一个集合的内容。

  16. key_comp():返回一个函数,该函数用于比较集合中的元素。

  17. value_comp():返回一个函数,该函数用于比较集合中元素的值。

什么是map?

1,map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元 素。

2. 在map中,键值key通常用于排序和唯一地标识元素,而值value中存储与此键值key关联的 内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型 value_type绑定在一起,为其取别名称为pair。

3,在内部,map中的元素总是按照键值key进行比较排序的。

4. map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序 对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。

5. map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。

6. map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。

map的重点--[ ]

[ ]总的来说:

情况一:[ ]如果已经有元素,则是find的功能,或修改,返回元素的迭代器, key不存在时抛异常

情况二:[ ]如果没有元素,则执行insert的一个功能,即插入加修改,返回插入元素的迭代器, key不存在时抛异常

总结 

1. map中的的元素是键值对 

2. map中的key是唯一的,并且不能修改

3. 默认按照小于的方式对key进行比较

4. map中的元素如果用迭代器去遍历,可以得到一个有序的序列

5. map的底层为平衡搜索树(红黑树),查找效率比较高O(log_2 N) 

6. 支持[]操作符,operator[]中实际进行插入查找

一个基础的实例:

map<string, string> high = { {"one","vector"}, {"two","List"} };
high.insert(make_pair("three", "queue"));
high["four"] = "stack";
for (const auto& e : high)
{
	cout << e.first << " ," << e.second << endl;
}

map常用函数:

  1. empty():检查map是否为空。

  2. size():返回map中元素的数量。

  3. clear():移除map中的所有元素。

  4. insert(value):向map中插入一个新的键值对。如果键已存在,则不会插入,并且可能返回一个指向现有元素的迭代器。

  5. erase(key):根据键删除元素。也可以删除指定范围内的元素或使用迭代器来删除元素。

  6. find(key):查找具有指定键的元素。如果找到,返回指向该元素的迭代器;如果未找到,返回end()迭代器。

  7. count(key):返回map中具有指定键的元素数量,对于map来说总是0或1。

  8. lower_bound(key):返回指向第一个不小于指定键的元素的迭代器。

  9. upper_bound(key):返回指向第一个大于指定键的元素的迭代器。

  10. equal_range(key):返回一个包含所有等于指定键的元素的区间,对于map来说,这个区间由lower_boundupper_bound返回的迭代器界定。

  11. begin():返回指向map开始的迭代器。

  12. end():返回指向map结束的迭代器。

  13. rbegin():返回指向map逆向开始的迭代器。

  14. **rend()``:返回指向map`逆向结束的迭代器。

  15. swap(map):交换当前map的内容与另一个map的内容。

  16. key_comp():返回一个函数,该函数用于比较map中的键。

  17. value_comp():返回一个函数,该函数用于比较map中的值(即键值对)。

  18. get_allocator():返回一个副本,该副本是用于map的分配器对象。

  19. max_size():返回map可以容纳的最大元素数量。

  20. operator[](key):通过下标访问或设置与指定键关联的值。如果键不存在,它将插入一个新元素,并使用默认构造函数构造值。

引用习题:

一,二个数组的交集

给定两个数组 nums1 和 nums2 ,返回 它们的 交集,输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 

解题代码:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
    set<int> number1(nums1.begin(),nums1.end());
    set<int> number2(nums2.begin(),nums2.end());
    
    auto it1=number1.begin();
    auto it2=number2.begin();
    vector<int> answer;
    while(it1!=number1.end()&it2!=number2.end())
    {
        if(*it1<*it2)
        {
          *it1++;
        }
        else if(*it1>*it2)
        {
            *it2++;
        }
        else
        {
            answer.push_back(*it1);
            *it1++;
            *it2++;
        }
    }
    return answer;
    }
};

二,前K个高频单词

给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。

返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序。

解题代码:

class Solution {
public:
    // 仿函数
    struct compare {
        bool operator()(const pair<string, int>& h1,
                      const pair<string, int>& h2) {
            return h1.second>h2.second;
        }
    };

    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string, int> number;
        for (const auto& e : words) {
            number[e]++;
        }

        vector<pair<string, int>> temp(number.begin(), number.end());
        stable_sort(temp.begin(), temp.end(), compare());
        vector<string> answer;
        for (int i = 0; i < k; i++) {
            answer.push_back(temp[i].first);
        }

        return answer;
    }
};

感谢大家的收看,我们一起努力,争取高offer!,下一篇我将讲avl树啦

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

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

相关文章

[240803] Prompt Fuzzer 新版本发布 | Windows 会在更新时进行时间调整以减少碳排放

目录 Prompt Fuzzer 新版本发布&#xff1a;更强大、更灵活的 GenAI 应用安全评估工具Windows 会在更新时进行时间调整以减少碳排放 Prompt Fuzzer 新版本发布&#xff1a;更强大、更灵活的 GenAI 应用安全评估工具 Prompt Security 发布了新版 Prompt Fuzzer&#xff0c;这是…

CSS+js:顶部导航栏背景滚动渐变、顶部背景滚动渐变

一、效果图 图1 图2 图3 二、gradual.html代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>顶部导航栏渐变和顶部背景渐变</title></head><body><div class"content-root" id&quo…

Linux PSCI框架

Linux PSCI框架 概述 参考链接&#xff1a; 简单讲解Linux PSCI框架-Linxu内核栈 概述 PSCI &#xff08;Power State Coordination Interface&#xff09; 是ARM定义的电源管理接口规范&#xff0c;由firm来实现。Linux系统通过smc/hvc指令&#xff08;设备树可查看是那种&a…

5.7软件质量和软件度量

软件质量和软件度量 软件质量软件质量特性ISO/EC9126软件质量模型练习题Mc Call质量模型 软件质量保证软件评审软件容错技术结构冗余信息冗余时间元余冗余附加技术 软件度量练习题 软件质量 软件质量&#xff1a;是指反映软件系统或软件产品满足规定或隐含需求的能力的特征和特…

代码随想录算法训练营day32 | 509. 斐波那契数 、70. 爬楼梯 、746. 使用最小花费爬楼梯

碎碎念&#xff1a;开始动态规划了&#xff01;加油&#xff01; 参考&#xff1a;代码随想录 动态规划理论基础 动态规划常见类型&#xff1a; 动规基础类题目背包问题打家劫舍股票问题子序列问题 解决动态规划问题应该要思考清楚的&#xff1a; 动态规划五部曲&#xff1…

使用 continue 自定义 AI 编程环境

一直在使用github 的 copilot 来编程&#xff0c;确实好用&#xff0c;对编码效率有很大提升。 但是站在公司角度&#xff0c;因为它只能对接公网&#xff08;有代码安全问题&#xff09;。另外&#xff0c;它的扩展能力也不强&#xff0c;无法适配公司特定领域的知识库&#x…

c# winform 创建日志登录界面

一.创建一个用于登录的Login的复合控件 1.右击项目文件&#xff0c;点击添加用户控件&#xff0c;设置为控件名为Login。 2.拉动两个lable控件&#xff0c;两个textBox控件&#xff0c;一个button,一个CheckBox控件。 3.将控件的权限&#xff08;Modifiers&#xff09;设置为Pu…

Unity2D在处理精灵表过程中出现不清晰的解决方法

问题阐述 在我们拿到一张精灵表的时候&#xff0c;我们通常要进行切割。但这样往往导致切割的效果不是很好&#xff0c;这里举一个简单的例子。 这是举例子用到的精灵表 我们先对他进行切割处理。 将single改为Multiope 进入精灵编辑器后&#xff0c;我们选择切割方式 此时我…

【数据结构】链表篇

1.链表的概念以及结构 概念&#xff1a;链表是一种物理储存结构上的非连续、非顺序的储存结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链式结构在逻辑上是连续的&#xff0c;但是在物理上不一定连续现实中的节点一般都是从堆上申请出来的从堆上申…

中度自闭症儿童上普校还是特校好呢

当家中有中度自闭症儿童时&#xff0c;家长们常常面临一个艰难的抉择&#xff1a;是让孩子进入普通学校&#xff08;普校&#xff09;接受融合教育&#xff0c;还是选择特殊教育学校&#xff08;特校&#xff09;接受更具针对性的教育&#xff1f;这是一个没有标准答案的问题&a…

Python基于逻辑回归的L1正则化(Lasso Logistic Regression)进行分类数据的特征选择项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 可以使用Lasso回归进行特征选择&#xff0c;尽管它本质上是一个用于回归问题的技术&#xff0c;但通过…

Python基于Prophet实现时间序列数据趋势周期特征提取项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 Prophet是Facebook开源的一个用于时间序列预测的库&#xff0c;它主要用于处理具有趋势、季节性和假期…

Springboot功能模块之文件上传(minio)

一、概述 1.1什么是MinIO&#xff1f; MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合使用&#xff0c;它兼容亚马逊 S3 云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。 官网…

基础第二关:8G 显存玩转书生大模型 Demo

基础任务 复现过程 结果截图 进阶任务 任务一 复现过程 结果截图 任务二 复现过程 结果截图

OpenFoam waves2foam 虚拟机 镜像 下载 Ubuntu

编译完成截图及安装版本信息&#xff1a; 下载地址(资源整理不易&#xff0c;下载使用需付费&#xff0c;且文件较大&#xff0c;不能接受请勿浪费时间下载): 链接&#xff1a;https://pan.baidu.com/s/1j0-MYpaG2rTYuizSWPFcxg?pwdmoxv 提取码&#xff1a;moxv

【String的介绍及使用】

String的介绍及使用 ## 小杨 为何学习string以及string的简单介绍 学习string类的原因 C语言中&#xff0c;字符串是以’\0’结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c; 但是这些库函数与字符串是分离开的&am…

详解基于百炼平台及函数计算快速上线网页AI助手

引言 在当今这个信息爆炸的时代&#xff0c;用户对于在线服务的需求越来越趋向于即时性和个性化。无论是寻找产品信息、解决问题还是寻求建议&#xff0c;人们都期望能够获得即时反馈。这对企业来说既是挑战也是机遇——如何在海量信息中脱颖而出&#xff0c;提供高效且贴心的…

【C语言】fseek、ftell以及rewind函数(随机文件读写)

文章目录 前言1. fseek1.1 fseek函数原型1.2 fseek函数的形式参数1.3 fseek实例演示 2. ftell2.1 ftell函数原型2.2 ftell函数的实例演示 3. rewind3.1 rewind函数原型3.2 rewind函数实例演示 前言 在之前&#xff0c;我讲过文件的顺序读写。但是我们可不可以随机读写文件呢&a…

PCL从理解到应用【09】 点云特征 | 关键点提取 | 方法汇总

前言 在PCL中&#xff0c;有多种方法和函数可以用来提取点云特征&#xff0c;本文介绍关键点提取。 提取点云关键点&#xff0c;本文介绍的方法包括&#xff1a;SIFT、Harris、NARF、ISS和SUSAN。 Harris 提取点云关键点&#xff0c;效果如下图所示&#xff1a; 白色点是原始…

MATLAB预测模型(2)

一、前言 在MATLAB中&#xff0c;进行线性回归、非线性回归以及统计回归预测可以通过多种方法实现&#xff0c;包括使用内置函数和自定义函数。下面&#xff0c;我将分别给出线性回归、非线性回归和基于统计回归进行预测的基本示例代码。 二、实现 1. 线性回归 MATLAB中的poly…