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

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;

    }
};

猜你喜欢

转载自blog.csdn.net/CoomCon/article/details/107698339