leetcode(8):序列容器||MAP||哈希表||SET||数据结构

本文对比分析了C++中hash_map与map的使用场景,详细解释了两者在构造函数、存储结构上的差异,以及在查找速度、数据量和内存使用方面的考量。同时介绍了set容器的基本用法与特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++11标准中,序列容器包含很多:
vector,list,array,deque

在c++中,头文件有

#include <map>
#include <hash_map>

两种。这阆中map其实差不多,都提供了key-value的查询,但是本质上又差了很多;
先说区别:

  • 构造函数。hash_map需要hash函数,等于函数;map只需要比较函数(小于函数).
  • 存储结构。hash_map采用hash表存储,map一般采用红黑树(RB Tree)实现。因此其memory数据结构是不一样的。

那么什么时候需要用hash_map,什么时候需要用map?
总体来说,hash_map 查找速度会比map快,而且查找速度基本和数据数据量大小,属于常数级别;而map的查找速度是log(n)级别。并不一定常数就比log(n)小,hash还有hash函数的耗时,明白了吧,如果你考虑效率,特别是在元素达到一定数量级时,考虑考虑hash_map。但若你对内存使用特别严格,希望程序尽可能少消耗内存,那么一定要小心,hash_map可能会让你陷入尴尬,特别是当你的hash_map对象特别多时,你就更无法控制了,而且hash_map的构造速度较慢。

现在知道如何选择了吗?权衡三个因素: 查找速度, 数据量, 内存使用。
——参考文章

1.MAP

第一

2.Set

被java中set的方便震惊后,发现C++也有;
性质:相同元素只能添加一次;
头文件:

#include <set>

用法和vector等C++容器类型非常像;

count()  划重点   ,用来查找set中某个某个键值出现的次数。
                ,因为一个键值在set只可能出现0或1次
               ,这样就变成了判断某一键值是否在set出现过了。

begin()        ,返回set容器的第一个元素

end()      ,返回set容器的最后一个元素

clear()          ,删除set容器中的所有的元素

empty()    ,判断set容器是否为空

max_size()   ,返回set容器可能包含的元素最大个数

size()      ,返回当前set容器中的元素个数

rbegin     ,返回的值和end()相同

rend()     ,返回的值和rbegin()相同

例题:力扣217
Set解法:

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        set<int> data;
        for(int i=0;i<nums.size();i++)
        {
            if(data.count(nums[i]))
            return true;
            data.insert(nums[i]);
        }
        return false;
    }
};

排序解法:(不是本文重点,只是个解题思路)

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        if(nums.size()<2)
            return false;
        vector<int>::iterator iter = nums.begin();
        while(iter!=nums.end()-1)
        {
            if((*iter)==*(iter+1))
                return true;
            iter++;
        }
        return false;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CoomCon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值