键值对(C++实现)

目录

键值对的定义

键值对的底层实现

键值对的作用

键值对的使用

对键值对中的值的搜索


一、键值对的定义

键值对(Key-Value Pair)是一种数据结构用于存储和表示两个相关联的值。在键值对中,一个值被关联到一个唯一的键上,通过键可以快速地访问和获取对应的值。

二、键值对的底层实现

代码实现如下:

#include <iostream>
#include <vector>
#include <list>
#include <functional>

// 自定义键值对类
template<typename Key, typename Value>
class KeyValuePair {
public:
    Key key;
    Value value;

    KeyValuePair(const Key& k, const Value& v) : key(k), value(v) {}
};

// 自定义哈希表实现
template<typename Key, typename Value>
class HashMap {
private:
    // 哈希表的桶,每个桶是一个链表
    std::vector<std::list<KeyValuePair<Key, Value>>> buckets;
    // 哈希函数
    std::hash<Key> hashFunction;
    // 桶的数量
    size_t bucketCount;

    // 获取键的哈希值
    size_t getBucketIndex(const Key& key) const {
        return hashFunction(key) % bucketCount;
    }

public:
    // 构造函数,初始化桶的数量
    HashMap(size_t size) : bucketCount(size) {
        buckets.resize(bucketCount);
    }

    // 插入键值对
    void insert(const Key& key, const Value& value) {
        size_t index = getBucketIndex(key);
        for (auto& pair : buckets[index]) {
            if (pair.key == key) {
                pair.value = value;
                return;
            }
        }
        buckets[index].emplace_back(key, value);
    }

    // 获取键对应的值
    bool get(const Key& key, Value& value) const {
        size_t index = getBucketIndex(key);
        for (const auto& pair : buckets[index]) {
            if (pair.key == key) {
                value = pair.value;
                return true;
            }
        }
        return false;
    }

    // 删除键值对
    bool remove(const Key& key) {
        size_t index = getBucketIndex(key);
        for (auto it = buckets[index].begin(); it != buckets[index].end(); ++it) {
            if (it->key == key) {
                buckets[index].erase(it);
                return true;
            }
        }
        return false;
    }
};

#include <iostream>
int main() {
    // 创建一个包含 10 个桶的哈希表
    HashMap<std::string, int> map(10);

    // 插入键值对
    map.insert("apple", 10);
    map.insert("banana", 20);

    // 获取键对应的值
    int value;
    if (map.get("apple", value)) {
        std::cout << "apple: " << value << std::endl;
    }

    // 删除键值对
    map.remove("banana");
    if (!map.get("banana", value)) {
        std::cout << "banana not found." << std::endl;
    }

    return 0;
}

代码解释:

  1. KeyValuePair 类用来存储键值对,包含键和值两个成员变量。
  2. HashMap 类实现了一个简单的哈希表。
    • buckets:存储键值对的桶数组,每个桶是一个链表。
    • hashFunction:使用 std::hash 计算键的哈希值。
    • bucketCount:桶的数量。
    • getBucketIndex:根据键的哈希值计算桶的索引。
    • insert:插入或更新键值对。
    • get:根据键获取对应的值。
    • remove:根据键删除键值对。
  3. main 函数演示了如何使用 HashMap 类进行插入、获取和删除操作。

三、键值对的作用

键值对的作用是提供一种便捷的方式来组织和存储数据。它可以用于多种场景,例如:

1.数据存储和检索:键值对可以用于存储和检索数据,其中键可以作为数据的唯一标识,值则是与该键相关联的数据。通过键,可以快速地定位和获取对应的值。

2.配置和参数设置:键值对可以用于存储配置信息或参数设置,其中键可以表示配置或参数的名称,值则是对应的配置值或参数值。通过键,可以方便地获取和修改配置或参数的值。

3.哈希表和索引:键值对可以用于构建哈希表或索引结构,其中键可以作为哈希表的索引或索引键,值则是与之对应的数据。通过键的哈希值,可以快速地定位和访问对应的值

四、键值对的使用 

使用键值对需要以下步骤:

1.定义键值对类型:首先,需要确定键和值的数据类型,并使用合适的数据结构来定义键值对类型。在C++中,可以使用std::pair来定义键值对类型,例如:std::pair<KeyType, ValueType>,其中KeyType表示键的数据类型,ValueType表示值的数据类型。

2.创建键值对对象:使用定义好的键值对类型,可以创建键值对对象。可以使用std::make_pair函数来创建键值对对象,该函数接受两个参数,分别是键和值,并返回一个包含这对键值的pair对象。

3.访问和操作键值对:通过键值对对象,可以访问和操作键和值。可以使用.操作符来获取键和值,例如:pairObject.first表示获取键,pairObject.second表示获取值。可以使用赋值操作符`=``来修改键和值。

以下是一个简单的示例代码,展示如何使用键值对:

#include <iostream>
#include <utility>
 
int main() {
  // 定义键值对类型
  using MyPair = std::pair<std::string, int>;
 
  // 创建键值对对象
  MyPair myPair = std::make_pair("apple", 5);
 
  // 访问和操作键值对
  std::cout << "Key: " << myPair.first << std::endl;  // 输出键
  std::cout << "Value: " << myPair.second << std::endl;  // 输出值
 
  // 修改键和值
  myPair.first = "banana";
  myPair.second = 10;
 
  // 再次访问和操作键值对
  std::cout << "Modified Key: " << myPair.first << std::endl;  // 输出修改后的键
  std::cout << "Modified Value: " << myPair.second << std::endl;  // 输出修改后的值
 
  return 0;
}

上述示例中,首先定义了一个键值对类型MyPair,其中键的类型为std::string,值的类型为int。然后使用std::make_pair函数创建了一个键值对对象myPair,键为"apple",值为5。通过.first和.second来访问和输出键和值。接下来,修改了键为"banana",值为10,并再次访问和输出修改后的键和值。

使用键值对可以根据实际需求存储和操作相关联的数据,提供了一种便捷的方式来组织和管理数据。注意在使用键值对时,需要确保键的唯一性,以避免数据冲突和混淆。

五、对键值对的中值的搜索

通过键搜索键值对中的值,可以使用以下步骤:

1.定义一个键值对容器:首先,需要选择一个适合的容器来存储键值对。在C++中,可以使用std::map或std::unordered_map来实现键值对的存储,其中std::map是有序的容器,std::unordered_map是无序的容器。

2.插入键值对:将键值对插入到容器中,可以使用容器提供的插入函数,例如insert。插入时,需要将键和值作为参数传递给插入函数。

3.通过键搜索值:使用键作为索引,可以通过容器提供的访问操作符[]来获取对应的值。将键作为索引放在[]中,即可返回相应的值。

以下是一个简单的示例代码,展示如何通过键搜索键值对中的值:

#include <iostream>
#include <map>
 
int main() {
  // 定义一个键值对容器
  std::map<std::string, int> myMap;
 
  // 插入键值对
  myMap.insert(std::make_pair("apple", 5));
  myMap.insert(std::make_pair("banana", 10));
  myMap.insert(std::make_pair("orange", 8));
 
  // 通过键搜索值
  std::string key = "banana";
  int value = myMap[key];
 
  // 输出搜索到的值
  std::cout << "Value for key '" << key << "': " << value << std::endl;
 
  return 0;
}

在上述示例中,首先定义了一个键值对容器std::map,其中键的类型为std::string,值的类型为int。然后,使用insert函数将三个键值对插入到容器中。接下来,通过将键"banana"作为索引放在[]中,即可获取对应的值。最后,输出搜索到的值。

需要注意的是,如果指定的键在容器中不存在,使用[]运算符将会插入一个新的键值对到容器中,并返回默认构造的值。如果不希望插入新的键值对,而只是想判断键是否存在,可以使用find函数来进行判断。

使用上述步骤,可以根据键快速搜索和获取键值对中的值。键值对容器提供了高效的数据存储和访问方式,适用于需要根据键进行查找和检索的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/982301.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ANTLR4的大数据SQL编辑器解析引擎实践|得物技术

一、背景 随着得物离线业务的快速增长&#xff0c;为了脱离全托管服务的一些限制和享受技术发展带来的成本优化&#xff0c;公司提出了大数据Galaxy开源演进项目&#xff0c;将离线业务从全托管且封闭的环境迁移到一个开源且自主可控的生态系统中&#xff0c;而离线开发治理套…

HTML第四节

一.复合选择器 1.后代选择器 注&#xff1a;1.后代选择器会选中后代所有的要选择的标签 2.儿子选择器 3.并集选择器 注&#xff1a;1.注意换行&#xff0c;同时选中多种标签 4.交集选择器 注&#xff1a;1.标签选择器放在最前面&#xff0c;例如放在类选择器的前面 2.两个选择…

数字后端培训实战项目六大典型后端实现案例

Q1:请教一个问题&#xff0c;cts.sdc和func.sdc在innovus用如何切换&#xff1f;在flow哪一步切换输入cts.sdc&#xff1f;哪一步切换到func.sdc&#xff0c;具体如何操作&#xff1f; 这个学员其实就是在问使用分段长clock tree时具体的flow流程是怎么样的&#xff1f;针对时…

linux 使用阿里云盘 阿里网盘

可参考&#xff1a;https://blog.csdn.net/qq_41174671/article/details/127310715 一、对文件<100M的可以使用如下方法&#xff1a; 1.临时使用阿里网盘 wget https://github.com/tickstep/aliyunpan/releases/download/v0.2.7/aliyunpan-v0.2.7-linux-amd64.zip unzip …

性能测试--大厂面试问题解析

性能测试作为软件开发中的关键环节&#xff0c;确保系统在高负载下仍能高效运行。面试中&#xff0c;相关问题常被问及&#xff0c;包括定义、类型、工具选择、规划与执行方法、常见瓶颈、敏捷环境下的处理、监控作用、虚拟用户数量确定、功能测试的区别、JMeter工作原理、HTTP…

hom_mat2d_to_affine_par 的c#实现

hom_mat2d_to_affine_par 的c#实现 背景&#xff1a;为课室贡献一个通用函数&#xff0c;实现halcon算子的同等效果&#xff0c;查询csdn未果&#xff0c;deepseek二哥与chtgpt大哥给不了最终程序&#xff0c;在大哥与二哥帮助下&#xff0c;最终实现同等效果。 踩坑&#xf…

前端跨域设置 withCredentials: true

在做登录认证的时候&#xff0c;会出现请求未登录的情况&#xff0c;查看请求头的时候发现并没有把登录时的cookie设置到第二次的请求头里面。查看资料才知道跨域请求要想带上cookie&#xff0c;必须要在ajax请求里加上 withCredentials: true 再次访问发现请求头可以携带cook…

【漫话机器学习系列】122.相关系数(Correlation Coefficient)

深入理解相关系数&#xff08;Correlation Coefficient&#xff09; 1. 引言 在数据分析、统计学和机器学习领域&#xff0c;研究变量之间的关系是至关重要的任务。我们常常想知道&#xff1a;当一个变量变化时&#xff0c;另一个变量是否也会随之变化&#xff1f;如果会&…

uniapp+微信小程序+地图+传入多个标记点显示+点击打开内置地图导航+完整代码

一、效果展示 二、完整代码 <template><view class"container"><map class"map-container" :latitude"latitude" :longitude"longitude" :markers"markers" :controls"controls" show-location m…

高效数据管理:WPF中实现带全选功能的DataGrid复选框列

目录 引言项目结构与准备工作XAML布局设计后台代码实现视图模型设计总结引言 在许多应用场景中,我们需要在表格中选择多行数据进行批量操作,如删除、导出等。为了提高用户体验,通常会在表格的第一列添加一个复选框,允许用户逐个或批量选择数据项。本文将详细介绍如何在 WP…

一周学会Flask3 Python Web开发-SQLAlchemy简介及安装

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射&#xff08;ORM&#xff09;工具&#xff0c;…

《Linux C 智能 IO 矩阵:输入输出的自适应数据流转》

1. 标准库IO简介 标准库IO特点&#xff1a;通过操作系统提供的接口&#xff08;API&#xff09;和操作系统进行交互。&#xff08;接近100个函数&#xff09; 1.1. IO的过程 操作系统&#xff1a;向上为用户提供操作接口&#xff0c;向下为统筹控制硬件。 操作系统的组成&#…

【大模型理论篇】--Mixture of Experts架构

Mixture of Experts&#xff08;MoE&#xff0c;专家混合&#xff09;【1】架构是一种神经网络架构&#xff0c;旨在通过有效分配计算负载来扩展模型规模。MoE架构通过在推理和训练过程中仅使用部分“专家”&#xff08;子模型&#xff09;&#xff0c;优化了资源利用率&#x…

智能云呼叫中心如何升级企业服务?带来新商机

当某国际零售品牌通过部署云呼叫中心将客服响应效率提升73%时&#xff0c;这场由云计算掀起的客户服务革命已悄然渗透到企业运营的毛细血管。在数字化转型的深水区&#xff0c;云呼叫中心正从"成本中心"蜕变为"价值引擎"&#xff0c;推动企业构建差异化的服…

java+jvm笔记

JUC synchornized原理&#xff08;java锁机制&#xff09;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 升级顺序&#xff1a; 无锁偏向锁&#xff0c;只有一个线程来访问轻量级锁&#xff0c;有两个线程交替访问重锁&#xff0c;两个及以上线…

CES Asia 2025增设未来办公教育板块,科技变革再掀高潮

作为亚洲消费电子领域一年一度的行业盛会&#xff0c;CES Asia 2025&#xff08;第七届亚洲消费电子技术贸易展&#xff09;即将盛大启幕。今年展会规模再度升级&#xff0c;预计将吸引超过500家全球展商参展&#xff0c;专业观众人数有望突破10万。除了聚焦人工智能、物联网、…

Sass 模块化革命:深入解析 @use 语法,打造高效 CSS 架构

文章目录 前言use 用法1. 模块化与命名空间2. use 中 as 语法的使用3. as * 语法的使用4. 私有成员的访问5. use 中with默认值6. use 导入问题总结下一篇预告&#xff1a; 前言 在上一篇中&#xff0c;我们深入探讨了 Sass 中 import 语法的局限性&#xff0c;正是因为这些问题…

AI-Deepseek + PPT

01--Deepseek提问 首先去Deepseek问一个问题&#xff1a; Deepseek的回答&#xff1a; 在汽车CAN总线通信中&#xff0c;DBC文件里的信号处理&#xff08;如初始值、系数、偏移&#xff09;主要是为了 将原始二进制数据转换为实际物理值&#xff0c;确保不同电子控制单元&…

解锁前端表单数据的秘密旅程:从后端到用户选择!✨

&#x1f604; 解锁前端表单数据的秘密旅程&#xff1a;从后端到用户选择&#xff01;✨ 嘿&#xff0c;技术爱好者们&#xff01;&#x1f44b; 你有没有在开发中遇到过这样的困惑&#xff1a;表单里的数据&#xff08;比如图片附件、识别点 ID&#xff09;从哪儿来的&#x…

【Linux】进程间通信 续

目录 管道的原理&#xff08;匿名管道&#xff09; 核心原理 站在内核的角度看管道的本质 接口 创建管道文件 代码示例 管道的特征 管道读写端的四种情况 管道的应用场景 命令行的管道。 使用管道实现进程池 初始化 控制子进程 退出 命名管道 命名管道的理解 …