leetcode706哈希表映射

题目

不使用任何内建的哈希表库设计一个哈希映射(HashMap)。

实现 MyHashMap 类: MyHashMap() 用空映射初始化对象 void put(int key, int value) 向
HashMap 插入一个键值对 (key, value) 。如果 key 已经存在于映射中,则更新其对应的值 value 。 int
get(int key) 返回特定的 key 所映射的 value ;如果映射中不包含 key 的映射,返回 -1 。 void
remove(key) 如果映射中存在 key 的映射,则移除 key 和它所对应的 value 。

答案和分析

class MyHashMap {
public:
    vector< list<pair<int,int>>> data;
    static const int base=769;
    int hash(int key){
        return key % base;
    }
//初始化你的哈希表 :base(param)是调用父类的构造函数  
//:this(param)是调用自己类的构造函数并且传参,与这个data(param)不同,他仅仅是定义自己
    MyHashMap():data(base) {
    }
    
    void put(int key, int value) {
        int h=hash(key);
        //列表的循环方式 C++11 中引入了一个新的关键字 auto , 用于自动型别推导
        for(auto it=data[h].begin();it!=data[h].end();it++){
        //列表中的类pair调用参数first,second
            if((*it).first==key){
                (*it).second=value;
                return;
            }
        }
        data[h].push_back(make_pair(key,value));
    }
    
    int get(int key) {
        int h=hash(key);
        for(auto it=data[h].begin();it!=data[h].end();it++){
            if((*it).first==key){
                return (*it).second;
            }
        }
        return -1;
    }
    //属于list的增加push_back()和erase()都不会变
    void remove(int key) {
        int h=hash(key);
        for(auto it=data[h].begin();it!=data[h].end();it++){
            if((*it).first==key){
                data[h].erase(it);
                return;
            }
        }
    }
};

1.关于hash 表在代码中的定义

哈希表的本质就是pair类的List,在进行操作之前,他的下标是要有函数映射的,这个函数要自己写,pair也是一种数据结构,如下,make_pair()是生成其的函数。

STL 中的 pair 类模板,因为关联容器的一些成员函数的返回值是 pair 对象,而且 map 和 multimap 容器中的元素都是 pair 对象。pair 的定义如下:

template <class_Tl, class_T2>
struct pair
{
    _T1 first;
    _T2 second;
    pair(): first(), second() {}  //用无参构造函数初始化 first 和 second
    pair(const _T1 &__a, const _T2 &__b): first(__a), second(__b) {}
    template <class_U1, class_U2>
    pair(const pair <_U1, _U2> &__p): first(__p.first), second(__p.second) {}
};

pair实例化出来的类都有两个成员变量,一个是 first, 一个是 second。

STL 中还有一个函数模板 make_pair,其功能是生成一个 pair 模板类对象。make_pair 的源代码如下:

template <class T1, class T2>
pair<T1, T2 > make_pair(T1 x, T2 y)
{
    return ( pair<T1, T2> (x, y) );
}

2.list在构造函数中的初始化

他其实是属于类构造函数自己的初始化,恰好是list 对数据成员进行初始化

格式:构造函数():变量名1(数值),变量名2(数值)
{} //!变量名不在花括号的后面,而是在花括号的前面

#include <iostream>
#include <string>
using namespace std;
 
class Cperson
{
public:
//直接初始化
	Cperson() :_a(1), _b(3.14f), _c("we are csdn")
	{
	}
	void show()
	{
		cout << _a << endl;
		cout << _b << endl;
		cout << _c << endl;
	}
 
private:
	int _a;
	float _b;
	string _c;
};
 
int main()
{
	Cperson op;
	op.show();
 
	system("pause");
	return 0;
}

当类成员中有引用和const常量时就一定得初始化,否则会报错
其他格式:
格式:构造函数():结构体名({各个结构体成员的初始值,按顺序用逗号隔开})
注意:结构体可以这样用花括号进行初始化,但是数组不可以
格式:构造函数(传递进来一个结构体):结构体名(传进来的结构体)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值