關聯容器-模板類pair數對

關聯容器

關聯容器和順序容器有著根本的不同:關聯容器中的元素是按關鍵字來保存和訪問的,而順序容器中的元素是按它們在容器中的位置來順序保存和訪問的。

關聯容器支持高效的關鍵字查找和訪問。

兩個主要的關聯容器(associative-container),set和map。

set 中每個元素只包含一個關鍵字。set 支持高效的關鍵字查詢操作一一檢查一個給定關鍵字是否在 set 中。

map 的元素是關鍵字-值 (key-value)對(也稱鍵-值對)。其中關鍵字起到索引的作用,值則表示與索引相關聯的數據。字典是一個很好的使用 map 的例子:可以將單詞作為關鍵字,將單詞釋義作為值。

標準庫針對set和map一共提供8種不同的關聯容器。1.是否運行關鍵字重復;2.是否按順序保存元素

set和multiset定義在頭文件set中;map和multimap定義在頭文件map中;無序容器則定義在頭文件unordered set和unordered map中。?

pair 數對是什么

pair數對是 C++ 標準庫中的一個模板類,它提供了一種簡單的方式來將兩個值組合成一個單元。這兩個值可以是相同類型,也可以是不同類型。就好比一個小巧的容器,專門用來存放兩個緊密相關的數據元素。例如,在處理平面直角坐標系中的點時,我們可以用一個pair來同時存儲點的橫坐標和縱坐標;在統計單詞出現頻率時,pair能將單詞及其對應的出現次數放在一起。

使用時需要引用文件

#include <utility>//通用工具
namespace std {template <typename T1,typename T2>struct pair {T1 first; //成員1T2 second;//成員2...};
}

操作函數

pair應用舉例

pair的基本操作舉例:

#include <iostream>
#include <utility>
using namespace std;int main()
{pair<int, double>p1;//創建一個空的pair//注意訪問first和second時沒有()cout << "p1=(" << p1.first << "," << p1.second << ")" << endl;pair<int, double>p2(10, 23.4);//創建一個pair,數據為(10,23.4)cout << "p2=(" << p2.first << "," << p2.second << ")" << endl;pair<int, double>p3(p2);//通過p2拷貝構造一個p3p3.first = 100;cout << "p3=(" << p3.first << "," << p3.second << ")" << endl;p1 = p3;//把p3賦值給p1cout << "p1 = p3后" << endl;cout << "p1=(" << p1.first << "," << p1.second << ")" << endl;p3 = make_pair(100, 200);cout << "p3 = make_pair(100,200)后" << endl;//通過get訪問p3的成員cout << "p3=(" << get<0>(p3) << "," << get<1>(p3) << ")" << endl;return 0;
}

作為函數參數

pair數對可以作為函數參數,使得函數能夠方便地接收一組相關的數據。

#include <iostream>
#include <cmath>
#include <utility>
using namespace std;double distance(pair<double, double> point1, pair<double, double> point2) {double dx = point2.first - point1.first;double dy = point2.second - point1.second;return sqrt(dx * dx + dy * dy);
}int main() {pair<double, double> p1(1.0, 2.0);pair<double, double> p2(4.0, 6.0);cout << "Distance between points: " << distance(p1, p2) << endl;return 0;
}

作為函數返回值

函數也可以返回pair數對,這樣就能一次性返回兩個相關的結果。

#include <iostream>
#include <utility>
using namespace std;
pair<int, int> MinMax(int* arr, int len)//找到數組的最小值和最大值
{int min = arr[0]; //最小值int max = arr[0];//最大值for (int i = 1; i < len; i++){if (arr[i] < min)min = arr[i];if (arr[i] > max)max = arr[i];}return make_pair(min, max);
}int main()
{int arr[] = { 3,1,8,9,34,2,67,5,70,12,34,65,99,20 };auto p = MinMax(arr, sizeof(arr) / sizeof(arr[0]));cout << "最小值:" << p.first << ",最大值:" << p.second << endl;return 0;
}

pair 數對與 STL 容器的結合

pair 在 vector 中的應用

pair 在 vector 中的應用 vector是 C++ 中常用的動態數組容器,當需要存儲一組相關的數對時,vector與pair的結合非常實用。例如,統計單詞出現次數的場景:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <utility>
using namespace std;vector<pair<string, int>> countWords(const vector<string>& words) {vector<pair<string, int>> wordCount;for (const string& word : words) {auto it = find_if(wordCount.begin(), wordCount.end(),[&word](const pair<string, int>& p) {return p.first == word;});if (it != wordCount.end()) {++(it->second);}else {wordCount.emplace_back(word, 1);}}return wordCount;
}int main() {vector<string> sentence = { "apple", "banana", "apple", "cherry", "banana", "apple" };vector<pair<string, int>> result = countWords(sentence);for (const auto& pair : result) {cout << pair.first << ": " << pair.second << " 次" << endl;}return 0;
}

pair 在 map 中的應用

map是一種關聯容器,它以鍵值對的形式存儲數據。實際上,map的內部實現就是基于pair的。map的鍵和值分別對應pairfirstsecond

#include <iostream>
#include <map>
#include <string>using namespace std;int main() {map<string, int> ageMap;ageMap["Alice"] = 25;ageMap["Bob"] = 30;for (const auto& pair : ageMap) {cout << pair.first << " " << pair.second << "歲" << endl;}return 0;
}

這里ageMap中的每一個元素本質上就是一個pair<string, int>

pair 數對的優勢與使用場景

代碼簡潔性

使用pair數對可以避免創建復雜的自定義結構體來存儲兩個相關的數據。例如,在簡單的坐標表示或鍵值對存儲場景中,pair能極大地簡化代碼結構,使代碼更加易讀。

數據關聯性

pair明確地表達了兩個數據元素之間的關聯關系。在函數參數傳遞和返回值中,使用pair能清晰地表明這兩個值是作為一個整體進行處理的,增強了代碼的語義性。

算法支持

C++ 標準庫中的許多算法,如排序、查找等,都對pair提供了良好的支持。這使得在處理包含pair的容器時,能夠方便地利用這些算法進行高效操作。

總結

pair數對作為 C++ 標準庫中的一個小巧而強大的工具,為我們在編程過程中處理相關數據提供了便捷的方式。從基本的定義、初始化和訪問,到在函數參數、返回值以及與 STL 容器的結合應用,pair數對都展現出了其獨特的優勢。它不僅能讓代碼更加簡潔明了,還能提升代碼的可讀性和可維護性。在日常編程中,當你遇到需要處理兩個相關數據的場景時,不妨嘗試使用pair數對,相信它會為你的編程工作帶來意想不到的便利。讓我們充分利用pair數對這一強大武器,在 C++ 的編程世界中更加游刃有余地前行。

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

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

相關文章

京東運維面試題及參考答案

目錄 OSPF 實現原理是什么? 請描述 TCP 三次握手的過程。 LVS 的原理是什么? 闡述 Nginx 七層負載均衡的原理。 Nginx 與 Apache 有什么區別? 如何查看監聽在 8080 端口的是哪個進程(可舉例:netstat -tnlp | grep 8080)? OSI 七層模型是什么,請寫出各層的協議。 …

輸入框輸入數字且保持精度

在項目中如果涉及到金額等需要數字輸入且保持精度的情況下&#xff0c;由于輸入框是可以隨意輸入文本的&#xff0c;所以一般情況下可能需要監聽輸入框的change事件&#xff0c;然后通過正則表達式去替換掉不匹配的文本部分。 由于每次文本改變都會被監聽&#xff0c;包括替換…

使用 requests 和 BeautifulSoup 解析淘寶商品

以下將詳細解釋如何通過這兩個庫來實現按關鍵字搜索并解析淘寶商品信息。 一、準備工作 1. 安裝必要的庫 在開始之前&#xff0c;確保已經安裝了 requests 和 BeautifulSoup 庫。如果尚未安裝&#xff0c;可以通過以下命令進行安裝&#xff1a; bash pip install requests…

C#調用ACCESS數據庫,解決“Microsoft.ACE.OLEDB.12.0”未注冊問題

C#調用ACCESS數據庫&#xff0c;解決“Microsoft.ACE.OLEDB.12.0”未注冊問題 解決方法&#xff1a; 1.將C#采用的平臺從AnyCpu改成X64 2.將官網下載的“Microsoft Access 2010 數據庫引擎可再發行程序包AccessDatabaseEngine_X64”文件解壓 3.安裝解壓后的文件 點擊下載安…

【文獻閱讀】Vision-Language Models for Vision Tasks: A Survey

發表于2024年2月 TPAMI 摘要 大多數視覺識別研究在深度神經網絡&#xff08;DNN&#xff09;訓練中嚴重依賴標注數據&#xff0c;并且通常為每個單一視覺識別任務訓練一個DNN&#xff0c;這導致了一種費力且耗時的視覺識別范式。為應對這兩個挑戰&#xff0c;視覺語言模型&am…

【Kubernetes】StorageClass 的作用是什么?如何實現動態存儲供應?

StorageClass 使得用戶能夠根據不同的存儲需求動態地申請和管理存儲資源。 StorageClass 定義了如何創建存儲資源&#xff0c;并指定了存儲供應的配置&#xff0c;例如存儲類型、質量、訪問模式等。為動態存儲供應提供了基礎&#xff0c;使得 Kubernetes 可以在用戶創建 PVC 時…

Muduo網絡庫介紹

1.Reactor介紹 1.回調函數 **回調&#xff08;Callback&#xff09;**是一種編程技術&#xff0c;允許將一個函數作為參數傳遞給另一個函數&#xff0c;并在適當的時候調用該函數 1.工作原理 定義回調函數 注冊回調函數 觸發回調 2.優點 異步編程 回調函數允許在事件發生時…

Debian編譯安裝mysql8.0.41源碼包 筆記250401

Debian編譯安裝mysql8.0.41源碼包 以下是在Debian系統上通過編譯源碼安裝MySQL 8.0.41的完整步驟&#xff0c;包含依賴管理、編譯參數優化和常見問題處理&#xff1a; 準備工作 1. 安裝編譯依賴 sudo apt update sudo apt install -y \cmake gcc g make libssl-dev …

Git常用問題收集

gitignore 忽略文件夾 不生效 有時候我們接手別人的項目時&#xff0c;發現有的忽略不對想要修改&#xff0c;但發現修改忽略.gitignore后無效。原因是如果某些文件已經被納入版本管理在.gitignore中忽略路徑是不起作用的&#xff0c;這時候需要先清除本地緩存&#xff0c;然后…

編程哲學——TCP可靠傳輸

TCP TCP可靠傳輸 TCP的可靠傳輸表現在 &#xff08;1&#xff09;建立連接時三次握手&#xff0c;四次揮手 有點像是這樣對話&#xff1a; ”我們開始對話吧“ ”收到“ ”好的&#xff0c;我收到你收到了“ &#xff08;2&#xff09;數據傳輸時ACK應答和超時重傳 ”我們去吃…

【MediaPlayer】基于libvlc+awtk的媒體播放器

基于libvlcawtk的媒體播放器 libvlc下載地址 awtk下載地址 代碼實現libvlc相關邏輯接口UI媒體接口實例化媒體播放器注意事項 libvlc 下載地址 可以到https://download.videolan.org/pub/videolan/vlc/去下載一個vlc版本&#xff0c;下載后其實是vlc的windows客戶端&#xff0…

pulsar中的延遲隊列使用詳解

Apache Pulsar的延遲隊列支持任意時間精度的延遲消息投遞&#xff0c;適用于金融交易、定時提醒等高時效性場景。其核心設計通過堆外內存索引隊列與持久化分片存儲實現&#xff0c;兼顧靈活性與可擴展性。以下從實現原理、使用方式、優化策略及挑戰展開解析&#xff1a; 一、核…

單鏈表的實現 | 附學生信息管理系統的實現

目錄 1.前言&#xff1a; 2.單鏈表的相關概念&#xff1a; 2.1定義&#xff1a; 2.2形式&#xff1a; 2.3特點&#xff1a; 3.常見功能及代碼 &#xff1a; 3.1創建節點&#xff1a; 3.2頭插&#xff1a; 3.3尾插&#xff1a; 3.4頭刪&#xff1a; 3.5尾刪&#xff1a; 3.6插入…

java實用工具類Localstorage

public class LocalStorageUtil {//提供ThreadLocal對象,private static ThreadLocal threadLocalnew ThreadLocal();public static Object get(){return threadLocal.get();}public static void set(Object o){threadLocal.set(o);}public static void remove(){threadLocal.r…

LLM-大語言模型淺談

目錄 核心定義 典型代表 核心原理 用途 優勢與局限 未來發展方向 LLM&#xff08;Large Language Model&#xff09;大語言模型&#xff0c;指通過海量文本數據訓練 能夠理解和生成人類語言的深度學習模型。 核心定義 一種基于深度神經網絡&#xff08;如Transformer架…

【小兔鮮】day03 Home模塊與一級分類

【小兔鮮】day03 Home模塊與一級分類 1. Home-整體結構搭建和分類實現1.1 頁面結構 2. Home-banner輪播圖功能實現 1. Home-整體結構搭建和分類實現 1.1 頁面結構 分類實現 2. Home-banner輪播圖功能實現 輪播圖實現 在HomeBanner.vue中寫出輪播圖的結構 在apis目錄下新建h…

C++中的多態和模板

#include <iostream> #include <cstdlib> #include <ctime> #include <string>using namespace std;// 武器基類 class Weapon { public:virtual ~Weapon() {}virtual string getName() const 0; // 獲取武器名稱virtual int getAtk() const 0; …

Spring 概念

Spring 是一個功能強大、靈活且廣泛使用的 Java 企業級開發框架&#xff0c;它誕生于 2003 年&#xff0c;由 Rod Johnson 創建&#xff0c;初衷是簡化 Java EE 的開發過程。 一、Spring 是什么&#xff1f; 簡單來說&#xff1a; Spring 是一個輕量級的 Java 開發框架&#…

神經網絡之損失函數

引言&#xff1a;損失函數 &#xff08;Loss Function&#xff09;是機器學習和深度學習中非常重要的一個概念。用于衡量模型的預測值與真實值之間的差異&#xff0c;從而指導模型優化其參數以最小化這種差異。 一、損失函數作用 量化誤差&#xff1a;損失函數是將預測值和真實…

Java 基礎-32-枚舉-枚舉的應用場景

在Java編程中&#xff0c;枚舉&#xff08;Enum&#xff09;提供了一種強大的方式來定義一組固定的常量。它們不僅限于簡單的用途&#xff0c;還可以包含構造函數、方法和字段等高級功能&#xff0c;使其適用于多種不同的應用場景。本文將探討幾種常見的使用枚舉的場景&#xf…