键值对(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函数来进行判断。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Docker 部署 RabbitMQ 并实现数据持久化

非常好&#xff01;以下是一份完整的 Docker 部署 RabbitMQ 的博客文档&#xff0c;包含从安装到问题排查的详细步骤。你可以直接将其发布到博客中。 使用 Docker 部署 RabbitMQ 并实现数据持久化 RabbitMQ 是一个开源的消息队列系统&#xff0c;广泛应用于分布式系统中。使用…

springboot429-基于springboot的教务管理系统(源码+数据库+纯前后端分离+部署讲解等)

&#x1f495;&#x1f495;作者&#xff1a; 爱笑学姐 &#x1f495;&#x1f495;个人简介&#xff1a;十年Java&#xff0c;Python美女程序员一枚&#xff0c;精通计算机专业前后端各类框架。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xf…

my学习网址

文章目录 1.软件版本管控GIT学习网站大全1官方文档类2在线教程类3互动学习类4问答社区类 Linux学习网址1、 Linux命令行与shell脚本编程大全 1.软件版本管控 GIT学习网站大全 廖雪峰网站 以下为你推荐不同类型的学习Git的网站&#xff1a; 1官方文档类 Git官方文档 网址&am…

Best practice-生产环境中加锁的最佳实践

什么是死锁&#xff1f; 场景&#xff1a;图书馆有两个相邻的储物柜&#xff08;柜子A和柜子B&#xff09;&#xff0c;小明和小红需要同时使用这两个柜子才能完成借书流程。 互斥资源 每个柜子只有一把钥匙&#xff0c;且一次只能被一人使用&#xff08;资源不可共享&#x…

极狐GitLab 17.9 正式发布,40+ DevSecOps 重点功能解读【四】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

黄昏时间户外街拍人像Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍 黄昏时分有着独特而迷人的光线&#xff0c;使此时拍摄的人像自带一种浪漫、朦胧的氛围 。通过 Lr 调色&#xff0c;可以进一步强化这种特质并根据不同的风格需求进行创作。Lr&#xff08;Lightroom&#xff09;作为专业的图像后期处理软件&#xff0c;提供了丰富的调色…

Spring Boot 项目中 Redis 常见问题及解决方案

目录 缓存穿透缓存雪崩缓存击穿Redis 连接池耗尽Redis 序列化问题总结 1. 缓存穿透 问题描述 缓存穿透是指查询一个不存在的数据&#xff0c;由于缓存中没有该数据&#xff0c;请求会直接打到数据库上&#xff0c;导致数据库压力过大。 解决方案 缓存空值&#xff1a;即使…

信息系统项目管理师--整合管理

信息系统项目管理师–整合管理

关于tomcat使用中浏览器打开index.jsp后中文显示不正常是乱码,但英文正常的问题

如果是jsp文件就在首行加 “<% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %>” 如果是html文件 在head标签加入&#xff1a; <meta charset"UTF-8"> 以jsp为例子&#xff0c;我们…

微服务的春天:基于Spring Boot的架构设计与实践

微服务的春天:基于Spring Boot的架构设计与实践 在如今的技术领域,微服务架构俨然成为了解决复杂系统开发与运维挑战的关键利器。作为一名资深运维和自媒体创作者,笔名Echo_Wish,我将深入探讨基于Spring Boot的微服务架构设计,结合实例代码说明观点,希望能为大家带来启发…

JVM参数调整

一、内存相关参数 1. 堆内存控制 -Xmx&#xff1a;最大堆内存&#xff08;如 -Xmx4g&#xff0c;默认物理内存1/4&#xff09;。-Xms&#xff1a;初始堆内存&#xff08;建议与-Xmx相等&#xff0c;避免动态扩容带来的性能波动&#xff09;。-Xmn&#xff1a;新生代大小&…

AVM 环视拼接 鱼眼相机

https://zhuanlan.zhihu.com/p/651306620 AVM 环视拼接方法介绍 从内外参推导IPM变换方程及代码实现&#xff08;生成AVM环视拼接图&#xff09;_avm拼接-CSDN博客 经典文献阅读之--Extrinsic Self-calibration of the Surround-view System: A Weakly... (环视系统的外参自…

【哇! C++】类和对象(三) - 构造函数和析构函数

目录 一、构造函数 1.1 构造函数的引入 1.2 构造函数的定义和语法 1.2.1 无参构造函数&#xff1a; 1.2.2 带参构造函数 1.3 构造函数的特性 1.4 默认构造函数 二、析构函数 2.1 析构函数的概念 2.2 特性 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中…

【五.LangChain技术与应用】【11.LangChain少样本案例模板:小数据下的AI训练】

深夜的创业孵化器里,你盯着屏幕上的医疗AI项目,手里攥着仅有的97条标注数据——这是某三甲医院心内科攒了三年的罕见病例。投资人刚刚发来最后通牒:“下周demo要是还分不清心肌炎和感冒,就撤资!” 这时你需要掌握的不是更多数据,而是让每个样本都变成会复制的孙悟空的毫毛…

2005-2019年各省城镇人口数据

2005-2019年各省城镇人口数据 1、时间&#xff1a;2005-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;地区、年份、城镇人口(万人) 4、范围&#xff1a;31省 5、指标解释&#xff1a;‌城镇人口是指居住在城市、集镇的人口&#xff0c;主要依据人群…

Anaconda 部署 DeepSeek

可以通过 Anaconda 环境部署 DeepSeek 模型&#xff0c;但需结合 PyTorch 或 TensorFlow 等深度学习框架&#xff0c;并手动配置依赖项。 一、Anaconda 部署 DeepSeek 1. 创建并激活 Conda 环境 conda create -n deepseek python3.10 # 推荐 Python 3.8-3.10 conda activate…

Python 面向对象高级编程-定制类

目录 __str__ __iter__ __getitem__ __getattr__ __call__ 小结 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意&#xff0c;这些在Python中是有特殊用途的。 __slots__我们已经知道怎么用了&#xff0c;__len__()方法我们也知道是为了能让class作用于len()…

MCP与RAG:增强大型语言模型的两种路径

引言 近年来&#xff0c;大型语言模型&#xff08;LLM&#xff09;在自然语言处理任务中展现了令人印象深刻的能力。然而&#xff0c;这些模型的局限性&#xff0c;如知识过时、生成幻觉&#xff08;hallucination&#xff09;等问题&#xff0c;促使研究人员开发了多种增强技…

IDEA Generate POJOs.groovy 踩坑小计 | 生成实体 |groovy报错

一、无法生成注释或生成的注释是null 问题可能的原因&#xff1a; 1.没有从表里提取注释信息&#xff0c;修改def calcFields(table)方法即可 def calcFields(table) {DasUtil.getColumns(table).reduce([]) { fields, col ->def spec Case.LOWER.apply(col.getDataType().…

ue5.5崩溃报gpu错误快速修复注册表命令方法

网上已经有很多方法了&#xff0c;自己写了个regedit比处理dos批处理命令&#xff0c;启动时需要win 管理员身份拷贝后&#xff0c;将以下代码&#xff0c;保存为 run.bat格式批处理文件&#xff0c;右键鼠标&#xff0c;在弹出菜单中&#xff0c;选择用管理员身份运行。即可。…