數據結構之map

map的基本介紹

我們常常把map稱之為映射,就是將一個元素(通常稱之為key鍵)與一個相對應的值(通常稱之為value)關聯起來,比如說一個學生的名字(key)有與之對應的成績(value),它們是一一對應的,就好像一把鑰匙開一扇門,在map中鍵是唯一的,也只有唯一的確定的值。

在C++中,map提供了以下三種數據結構,其底層實現以及優劣如下表所示:

(注意:map中鍵是唯一的,但是multimap則沒有此限制)

映射底層實現是否有序數值是否可以重復
std::map紅黑樹key有序key不可重復
std::multimap紅黑樹key有序key可重復
std::unordered_map哈希表key無序key值不可重復

std::unordered_map的key值存儲是無序的,底層實現為哈希表,查找速度更快,如果不需要排序而只是快速查找鍵對應的值,可以考慮使用。

std::mapstd::multimap的底層實現是紅黑樹,它的key值存儲是有序的,如果需要對鍵值對自定義排序,可以使用std::map

map的使用

使用映射容器需要引入頭文件<unordered_map>或者<map>

//引入unordered_map頭文件,包含unordered_map類型
#include <unordered_map>
//引入map頭文件,包含map類型和multimap類型
#include <map>

想要聲明map映射關系,需要指定鍵的類型和值的類型。

//聲明一個整數類型映射到整數類型的 無序映射
unordered_map<int,int> uMap;
//聲明一個將字符串映射到整數的'map',可以這樣聲明
map<string,int>myMap;

想要插入鍵值對key-value,需要使用insert()函數或者使用[]操作符來插入。如果鍵不存在,[]操作符將會創建一個新的鍵值對,將其插入到map中,并將值初始化為默認值(對于整數來說,默認值為0)。

uMap[0]=10;
uMap[10]=0;uMap["math"]=100;
uMap["english"]=80;

和set類似,可以使用find函數來檢查某個鍵是否存在于map中,它會返回一個迭代器。如果鍵存在,迭代器指向該鍵值對,否則指向map的末尾。

if(myMap.find("math")!=myMap.end()){//鍵存在
}else{//鍵不存在
}

你可以使用范圍for循環來遍歷map中的所有的鍵值對,進行各種操作。

for(const pair<int,int>&kv:umap){
}

當使用范圍for循環遍歷map時,我們需要聲明一個變量kv來存儲每鍵值對,這個變量的類型通常是pair類型,下面就讓我們來詳細的解釋一下const pair<int,int>&kv:umap

const用于聲明一個不可修改的變量,這意味著一旦變量被初始化,就不能再修改其值。常量通常用大寫字母表示。

注:因為const聲明的變量一旦創建后就無法修改值,所以必須初始化。

const double PI=3.1415926;

在這里,const關鍵字表示你只能讀取容器中的元素,而不能修改他們。

而pair<int,int>定義了kv也就是鍵值對的數據類型是pair,C++中的pair類型會將兩個不同的值組合成一個單元,常用于存儲鍵值對,創建pair的時候,也必須提供兩個類型名,比如上面的pair對象,兩個值的類型都是int,在使用時通過first和second成員來訪問pair中的第一個和第二個元素,它的first成員存儲鍵,而second成員存儲值。

&:這個符號表示kv是一個引用(reference),而不是值的拷貝,如果不使用引用的話,那在每次循環迭代中都會重新創建一個新的pair對象來復制鍵值,而這會導致不必要的內存分配和拷貝操作。

代碼編寫

while(n--)
{//輸入key和doorcin>>key>>door;//將key和對應的door放進map中umap[key]=door;
}

設置一個flag,用來標志是否找到匹配的鍵值對

bool flag=true;

遍歷map,判斷當前鍵值對中的值是否等于輸入的值,如果等于,則將鍵輸出并退出

for(const pair<int,int>&kv:umap)
{//檢查當前鍵值對中的值是否等于xif(kv.second==x){cout<<kv.first<<endl;//如果找到了匹配的鍵值對,將kv.first輸出到標準輸出,并換行flag=false;break;}
}

因此,本題的源代碼是:

#include <iostream>
#include <unordered_map>using namespace std;int main()
{int s,n,key,door,x;cin>>s;while(s--){unordered_map<int,int> umap;cin>>n;while(n--){cin>>key>>door;umap[key]=door;}cin>>x;bool flag=true;for(const pair<int,int>&kv:umap){if(kv.second==x){cout<<kv.first<<endl;flag=false;}}if(flag){cout<<"Can't open the door."<<endl;}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914124.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914124.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914124.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue3 canvas 選擇器 Canvas 增加頁面性能

文章目錄Vue3 選擇器 Canvas 增加頁面性能基于Vue3 Composition API和Canvas實現的交互式選擇器&#xff0c;支持PC端和移動端的拖動選擇、多選取消選擇功能vue3組件封裝html代碼Vue3 選擇器 Canvas 增加頁面性能 基于Vue3 Composition API和Canvas實現的交互式選擇器&#xf…

Python 實戰:打造多文件批量重命名工具

引言在實際運維、測試、數據分析、開發流程中&#xff0c;我們經常會處理成百上千條命令操作&#xff0c;例如&#xff1a;各種腳本任務&#xff08;啟動、備份、重啟、日志查看&#xff09;數據處理流程&#xff08;爬取 → 清洗 → 統計 → 可視化&#xff09;配置自動化&…

設計模式筆記_結構型_代理模式

1. 代理模式介紹代理模式是一種結構型設計模式&#xff0c;它允許你提供一個代理對象來控制對另一個對象的訪問。代理對象通常在客戶端和目標對象之間起到中介作用&#xff0c;能夠在不改變目標對象的前提下增加額外的功能操作&#xff0c;比如延遲初始化、訪問控制、日志記錄等…

C語言<數據結構-單鏈表>(收尾)

上篇博客我將基礎的尾插、尾刪、頭插、頭刪逐一講解了&#xff0c;這篇博客將對上篇博客進行收尾&#xff0c;講一下指定位置操作增刪以及查找這幾個函數&#xff0c;其實大同小異&#xff1a;一.查找函數&#xff1a;查找函數其實就是一個簡單的循環遍歷&#xff0c;所以不加以…

十年架構心路:從單機到云原生的分布式系統演進史

十年架構心路&#xff1a;從單機到云原生的分布式系統演進史 這里寫目錄標題十年架構心路&#xff1a;從單機到云原生的分布式系統演進史一、技術生涯的起點&#xff1a;單體架構的黃金時代1.1 典型技術棧1.2 記憶深刻的故障二、分布式架構轉型期2.1 服務化拆分實踐2.2 分布式事…

使用docker搭建nginx

安裝docker 和 docker compose驗證docker版本配置docker目錄配置代理&#xff0c;使docker能訪問外網能否ping通最后直接拉入鏡像即可docker pull nginx

Intel新CPU助攻:微軟Copilot+將登陸臺式電腦

微軟的Copilot PC計劃已經推出一年多&#xff0c;但目前僅支持平板電腦和筆記本電腦&#xff0c;以及少數迷你電腦。 隨著Intel下一代桌面處理器——代號為“Arrow Lake Refresh”的推出&#xff0c;Copilot PC功能有望擴展到桌面計算機。 要支持Copilot PC的所有功能&#xff…

【Kubernetes】跨節點 Pod 網絡不通排查案例

最近在部署一個集群環境的時候&#xff0c;發現集群中一個子節點與其他子節點不通&#xff0c;而 master 節點可與任何子節點互通&#xff0c;通過抓包排查后&#xff0c;發現是 Linux 路由決策導致的。因此&#xff0c;在此記錄下來&#xff0c;希望對大家有所幫助。1、環境及…

【算法訓練營Day11】二叉樹part1

文章目錄理論基礎二叉樹的遞歸遍歷前序遍歷中序遍歷后序遍歷總結二叉樹的層序遍歷基礎層序遍歷二叉樹的右視圖理論基礎 二叉樹在結構上的兩個常用類型&#xff1a; 滿二叉樹完全二叉樹 在功能應用上的比較常用的有&#xff1a; 二叉搜索樹&#xff1a; 節點有權值、遵循”左…

Flutter 之 table_calendar 控件

1.庫導入在pubspec.yaml文件中dev_dependencies:table_calendar: ^3.2.02. 代碼編寫TableCalendar(daysOfWeekHeight: 20,availableGestures: AvailableGestures.horizontalSwipe,firstDay: DateTime.now().subtract(const Duration(days: 365)),lastDay: DateTime.now(),cal…

【leetcode】1486. 數組異或操作

數組異或操作題目題解題目 1486. 數組異或操作 給你兩個整數&#xff0c;n 和 start 。 數組 nums 定義為&#xff1a;nums[i] start 2*i&#xff08;下標從 0 開始&#xff09;且 n nums.length 。 請返回 nums 中所有元素按位異或&#xff08;XOR&#xff09;后得到的…

php7.4使用 new DateTime;報錯 Class DateTime not found

php7.4使用 new DateTime;報錯Uncaught Error: Class ‘app\home\c\DateTime’ not found 查了半天資料&#xff0c;最后找到了解決辦法 DateTime 是 php 內置的類&#xff0c;不隸屬于任何命名空間&#xff0c;如果你需要在命名空間中使用須有 \ 聲明&#xff0c;解決辦法就是…

Gartner《構建可擴展數據產品建設框架》心得

一、背景與價值 1.1 “數據產品”為什么忽然重要? 傳統模式:業務提出需求 → IT 建數據集 → ETL 管道爆炸 → 維護成本指數級上升。 新范式:把“數據”包裝成“產品”,以產品思維迭代演進,強調復用、自助、可擴展。 Gartner 觀察到:大量組織把“報表”或“數據倉庫”重…

CentOS/RHEL LVM 磁盤擴展完整教程

CentOS/RHEL LVM 磁盤擴展完整教程&#x1f4dd; 前言 在Linux系統管理中&#xff0c;磁盤空間不足是經常遇到的問題。特別是在生產環境中&#xff0c;當根分區空間告急時&#xff0c;我們需要通過添加新磁盤來擴展存儲空間。本教程將詳細介紹如何在CentOS/RHEL系統中使用LVM&a…

LVGL應用和部署(用lua做測試)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】嵌入式產品做好了&#xff0c;下面就是測試和量產了。以按鍵屏幕的開發模式為例&#xff0c;如果僅僅是簡單的功能測試&#xff0c;那還比較好解決&…

phpstudy搭建pikachu

一.啟動mysql和nginx服務二.修改靶場文件參數點擊管理打開根目錄&#xff0c;將下載好的靶場源文件解壓到www目錄下三.找到此文件用記事本打開四.修改配置文件五.打開瀏覽器,輸入127.0.0.1/pikachu六.按照步驟初始化心得體會&#xff1a;如果mysql啟動又立刻停止&#xff0c;大…

【Linux】GDB/CGDB 調試器學習筆記

GDB/CGDB 調試器學習筆記&#x1f680; 前言 GDB 是 GNU 項目下功能強大的命令行調試器&#xff0c;適用于 C/C 等多種語言。CGDB 則是在 GDB 之上構建的輕量級 curses 界面&#xff0c;適合喜歡終端操作且習慣 vi 風格的人。一、GDB 入門篇 1. 編譯時帶調試信息 gcc -g -O0 -W…

鏈接代理后無法訪問網絡

路由方向的問題 cmd 輸入 route print 查看路由多了一個不是你網絡的路由 我的嘎嘎好用直接那都通 route add -p 0.0.0.0 mask 0.0.0.0 0.0.0.0 參考這個 固定ip if是代理鏈路的 鏈路口又敏感詞這個文章不合規兩次評論區問我

day37 早停策略和模型權重的保存

DAY 37 我今天的筆記是用cpu訓練的&#xff0c;請自行修改為gpu訓練 仍然是循序漸進&#xff0c;先復習之前的代碼 import torch import torch.nn as nn import torch.optim as optim from sklearn.datasets import load_iris from sklearn.model_selection import train_test_…

網絡爬蟲分類全解析

網絡爬蟲作為數據獲取的重要工具,其分類方式多樣,不同類型的爬蟲在技術實現、應用場景和功能特性上存在顯著差異。深入理解這些分類,有助于開發者根據實際需求選擇合適的爬蟲方案。本文將從技術特性、應用場景和架構設計三個維度,系統介紹網絡爬蟲的主要分類。 一、按技術…