c++实现HashMap

概述: 无聊的时候学一下。

完整代码:

#include <iostream>
#include <vector>
#include <list>
#include <algorithm>

template<typename K, typename V>
class HashMap {
public:
    HashMap(size_t capacity = 10) : capacity_(capacity), size_(0) {
        table_.resize(capacity_);
    }

    void put(const K& key, const V& value) {
        size_t index = hash(key) % capacity_;
        for (auto& pair : table_[index]) {
            if (pair.first == key) {
                pair.second = value;
                return;
            }
        }
        table_[index].emplace_back(key, value);
        ++size_;
    }

    V get(const K& key) {
        size_t index = hash(key) % capacity_;
        for (auto& pair : table_[index]) {
            if (pair.first == key) {
                return pair.second;
            }
        }
        throw std::runtime_error("Key not found");
    }

    bool remove(const K& key) {
        size_t index = hash(key) % capacity_;
        for (auto it = table_[index].begin(); it != table_[index].end(); ++it) {
            if (it->first == key) {
                table_[index].erase(it);
                --size_;
                return true;
            }
        }
        return false;
    }

    size_t size() const {
        return size_;
    }

private:
    size_t hash(const K& key) const {
        return std::hash<K>{}(key);
    }

    size_t capacity_;
    size_t size_;
    std::vector<std::list<std::pair<K, V>>> table_;
};

int main() {
    HashMap<std::string, int> map;
    map.put("one", 1);
    map.put("two", 2);
    map.put("three", 3);

    std::cout << "Size: " << map.size() << std::endl;
    std::cout << "Value of 'one': " << map.get("one") << std::endl;
    std::cout << "Value of 'two': " << map.get("two") << std::endl;
    std::cout << "Value of 'three': " << map.get("three") << std::endl;

    map.remove("two");
    std::cout << "Size after removing 'two': " << map.size() << std::endl;

    return 0;
}

这段代码使用单独的链实现了一个简单的哈希映射来解决冲突。让我们来分析一下主要组成部分:

template<typename K, typename V>是C++中模板的声明方式,表示这是一个模板函数或模板类。其中,KV是类型参数,可以在实例化模板时替换为具体的类型。

HashMap<std::string, int> map;   就是将k化成string,V化成int类型

HashMap类:这是一个表示散列映射的模板化类。它有put(key, value)方法来添加键值对,get(key)方法来检索与键相关的值,remove(key)方法来删除键值对,size()方法来获取哈希映射的当前大小。

HashMap(size_t capacity = 10) : capacity_(capacity), size_(0) { table_.resize(capacity_); }

这是C++中HashMap类的构造函数。它接受一个名为capacity的参数,默认值为10。在构造函数内部,它将成员变量capacity_设置为传入的capacity值,将size_设置为0,并调用table_.resize(capacity_)来调整哈希表的大小。这个构造函数的作用是初始化一个具有指定容量的空HashMap对象。

私有成员:
capacity_:哈希表的初始容量。
size_:表示当前存储在哈希映射中的元素数量。
表_:表示哈希表本身,实现为链表的向量。vector的每个元素都是键值对的链表(std::list)。

公共方法:

put(const K& key, const V& value):在哈希映射中插入一个键值对。它使用散列函数计算索引,然后遍历该索引处的链表,如果键已经存在,则更新该值,或者添加新的键值对。

get(const K& key):检索与给定键相关联的值。它使用散列函数计算索引,并在该索引处的链表中搜索键。如果找到,它返回相应的值;否则,它将抛出运行时错误。

remove(const K& key):删除与给定键相关联的键值对。它使用散列函数计算索引,并在该索引处的链表中搜索键。如果找到,则删除键值对并减小大小;否则,返回false。

size():返回当前哈希映射的大小。

Private Method:

hash(const K& key):该方法使用std::hash函数计算给定键的哈希值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

nanshaws

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

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

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

打赏作者

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

抵扣说明:

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

余额充值