C++ 实现哈希表的实例

yizhihongxing

下面是“C++ 实现哈希表的实例”的攻略。

什么是哈希表?

哈希表是一种用于存储键值对的数据结构,它通过哈希函数将键映射为一个确定的桶,然后将键值对存储到对应的桶中。哈希表的主要优势是能够支持快速的插入、查找和删除操作,因为它的查找时间是常数级别的,即 O(1)。

实现哈希表的基本步骤

在 C++ 中实现哈希表的基本步骤如下:

  1. 定义哈希函数:通常情况下,哈希函数会将键转化为一个整数值。可以使用 C++11 新增的 std::hash 及其特化模板来实现哈希函数,也可以自己定义哈希函数。
  2. 定义哈希表的数据结构:哈希表通常由一个数组和一个哈希函数组成,在数组中存储键值对。每个键值对是一个链表中的节点,用于解决哈希值冲突的问题。
  3. 实现哈希表的插入、查找和删除操作:哈希表的操作与链表非常类似,不同的是需要先对键进行哈希,然后找到对应的桶。

具体步骤我们将在下面的示例中说明。

示例1:使用 C++11 的 std::hash 实现哈希表

下面是一个使用 C++11 的 std::unordered_map 实现哈希表的示例。

#include <iostream>
#include <unordered_map>

int main()
{
    // 创建一个 unordered_map 容器,用于存储字符串和对应的整数值
    std::unordered_map<std::string, int> hashmap;

    // 添加键值对
    hashmap["hello"] = 1;
    hashmap["world"] = 2;
    hashmap["test"] = 3;

    // 查找键对应的值
    std::cout << hashmap["hello"] << std::endl;

    // 删除键值对
    hashmap.erase("test");

    return 0;
}

上面的代码中,我们先使用 std::unordered_map 定义了一个哈希表,它包含 std::string 类型的键和 int 类型的值。然后我们使用 [] 操作符向哈希表中添加键值对,并使用 [] 操作符找到键对应的值。最后使用 erase 函数删除键值对。这些操作与使用普通的数组非常相似,而且它们的时间复杂度也是常数级别的。

示例2:手动实现哈希表

下面是一个手动实现哈希表的示例,其中我们使用了一个简单的哈希函数和链表来解决哈希冲突的问题。

#include <iostream>
#include <string>

const int TABLE_SIZE = 128;

class Node
{
public:
    std::string key;
    int value;
    Node* next;

    Node(const std::string& key, int value) :
        key(key), value(value), next(nullptr)
    {}
};

class HashMap
{
private:
    Node** table;
    std::hash<std::string> hashFunc;

public:
    HashMap()
    {
        table = new Node*[TABLE_SIZE];
        for (int i = 0; i < TABLE_SIZE; i++)
        {
            table[i] = nullptr;
        }
    }

    ~HashMap()
    {
        for (int i = 0; i < TABLE_SIZE; i++)
        {
            Node* node = table[i];
            while (node != nullptr)
            {
                Node* temp = node;
                node = node->next;
                delete temp;
            }
        }
        delete[] table;
    }

    void put(const std::string& key, int value)
    {
        int index = hashFunc(key) % TABLE_SIZE;
        Node* node = table[index];

        if (node == nullptr)
        {
            table[index] = new Node(key, value);
        }
        else
        {
            while (node != nullptr)
            {
                if (node->key == key)
                {
                    node->value = value;
                    return;
                }
                else if (node->next == nullptr)
                {
                    node->next = new Node(key, value);
                    return;
                }
                node = node->next;
            }
        }
    }

    int get(const std::string& key)
    {
        int index = hashFunc(key) % TABLE_SIZE;
        Node* node = table[index];
        while (node != nullptr)
        {
            if (node->key == key)
            {
                return node->value;
            }
            node = node->next;
        }
        return -1;
    }

    void remove(const std::string& key)
    {
        int index = hashFunc(key) % TABLE_SIZE;
        Node* node = table[index];
        if (node == nullptr)
        {
            return;
        }
        else if (node->key == key)
        {
            table[index] = node->next;
            delete node;
        }
        else
        {
            while (node->next != nullptr)
            {
                if (node->next->key == key)
                {
                    Node* temp = node->next;
                    node->next = node->next->next;
                    delete temp;
                    return;
                }
                node = node->next;
            }
        }
    }
};

int main()
{
    // 创建一个哈希表,用于存储字符串和对应的整数值
    HashMap hashmap;

    // 添加键值对
    hashmap.put("hello", 1);
    hashmap.put("world", 2);
    hashmap.put("test", 3);

    // 查找键对应的值
    std::cout << hashmap.get("hello") << std::endl;

    // 删除键值对
    hashmap.remove("test");

    return 0;
}

上面的代码中,我们手动实现了哈希表的插入、查找和删除操作。具体来说,我们使用 std::hash 实现了一个简单的哈希函数,将字符串转化为一个整数并求模,然后根据这个整数找到对应的桶。每个桶是一个链表,用于存储键值对。我们实现了 put、get 和 remove 函数来完成哈希表的插入、查找和删除操作,这些操作的时间复杂度都是常数级别的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 实现哈希表的实例 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 解决Springboot @Autowired 无法注入问题

    解决 SpringBoot @Autowired 无法注入问题 在使用 SpringBoot 进行开发时,经常会使用到依赖注入,但有时会遇到 @Autowired 注解无法注入的问题。本文将介绍两种解决办法。 确认包扫描路径是否正确 在 SpringBoot 中,会默认扫描 @SpringBootApplication 注解所在的包及其子包下的 Java 类…

    other 2023年6月27日
    00
  • wordcloud是什么?

    Wordcloud,也叫做文字云或词云,是一种可视化展示文本数据的方式,在绘制过程中将文本中出现频率较高的单词以较大的字号呈现,而出现频率较低的单词会以较小的字号呈现,并使用不同的颜色、形状等进行美化渲染,让整个图像更具有美感和易读性。 Wordcloud的制作过程涵盖以下几个步骤: 准备文本数据。需要从相关数据源中获取相应的文本内容。 进行文本分词。根据具…

    其他 2023年4月16日
    00
  • 魔兽世界8.0血DK堆什么属性 鲜血死亡骑士属性选择及优先级

    魔兽世界8.0血DK堆什么属性 鲜血死亡骑士在8.0版本中的属性选择和优先级相比之前版本有了很大的变化。对于血DK而言,主属性仍然是耐力,但次要属性的选择则需要根据自己的装备和属性权值来进行调整和优化。 属性选择 在8.0版本中,鲜血死亡骑士的属性优先级为:1. 耐力2. 全能3. 急速4. 精通5. 暴击 其中,全能属性是8.0版本的新属性,它综合了所有次…

    other 2023年6月27日
    00
  • 古墓丽影崛起卡死无响应的解决方法

    古墓丽影崛起卡死无响应的解决方法: 问题描述 在游玩古墓丽影崛起时,有时会出现卡死或无响应的情况,导致游戏无法进行。这个问题可能是由于游戏兼容性、驱动程序或者游戏设置等多种原因造成的。 解决方法 方法一:清理游戏文件缓存 游戏文件缓存可能在一段时间后会影响游戏的执行,尝试清理缓存可能会解决掉这个问题。 打开 Steam 界面,进入游戏库; 在游戏右键菜单中选…

    other 2023年6月27日
    00
  • 基于MySQL架构图解

    基于MySQL架构图解攻略 MySQL是一种常用的关系型数据库管理系统,它的架构图可以帮助我们理解MySQL的内部工作原理。下面是一个详细的攻略,将会解释MySQL的各个组件和它们之间的关系。 1. MySQL架构图概述 MySQL的架构图主要由以下几个组件组成: 客户端:客户端是与MySQL服务器进行通信的应用程序。它可以是命令行工具、图形界面工具或者We…

    other 2023年8月2日
    00
  • windows下nginxHTTP服务器入门教程初级篇

    Windows下Nginx HTTP服务器入门教程(初级篇) 介绍 Nginx是一个高性能的开源HTTP服务器和反向代理服务器。本教程将详细介绍如何在Windows操作系统上安装和配置Nginx服务器。 步骤 步骤一:下载Nginx 打开Nginx官方网站(https://nginx.org/)。 在下载页面中,找到Windows版本的Nginx,并点击下载…

    other 2023年7月29日
    00
  • 存储单位的换算(kb mb gb)

    存储单位的换算(kb mb gb) 在计算机存储中,单位的选择起着至关重要的作用。在不同的场景下,我们需要使用不同的存储单位来表示数据的大小。常见的存储单位有kb、mb、gb等。下面将对这些存储单位进行详细的介绍,以及它们之间的转换。 存储单位的定义 kb(kilo byte),1kb等于1024个字节。 mb(mega byte),1mb等于1024kb,…

    其他 2023年3月28日
    00
  • JAVA匿名内部类(Anonymous Classes)的具体使用

    JAVA匿名内部类(Anonymous Classes)的具体使用攻略 匿名内部类是Java中一种特殊的类,它没有显式的类名,通常用于创建只需要使用一次的类的实例。匿名内部类可以用来实现接口、继承类或者作为方法参数传递。下面是匿名内部类的具体使用攻略,包含两个示例说明。 示例一:实现接口 interface Greeting { void sayHello(…

    other 2023年8月21日
    00
合作推广
合作推广
分享本页
返回顶部