鍵值對(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.pswp.cn/news/897076.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897076.shtml
英文地址,請注明出處:http://en.pswp.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;選擇用管理員身份運行。即可。…