【C++】標準庫中用于組合多個值的數據結構pair、tuple、array...

在 C++ 標準庫中,有多種數據結構可用于組合多個值,每種結構都有其特定的設計目的和適用場景。以下是主要組合數據結構的分類解析:

一、核心組合數據結構

1. std::pair (C++98)

用途:存儲兩個相關值(鍵值對、坐標點等)
特點:
固定大小(只能包含兩個元素)
支持不同類型
支持比較操作(按 first 然后 second)

#include <utility>// 創建 pair
auto point = std::make_pair(10, 20);
std::pair<std::string, int> person{"Alice", 30};// 訪問元素
std::cout << "X: " << point.first << ", Y: " << point.second;

2. std::tuple (C++11)

用途:存儲固定數量的異構值(任意類型、任意數量)
特點:
類型安全的泛型結構
支持最多約 10 個元素(實現定義)
編譯時類型檢查

#include <tuple>// 創建 tuple
auto data = std::make_tuple(42, "Hello", 3.14);
std::tuple<int, std::string, double> record(1, "Alice", 95.5);// 訪問元素(編譯時索引)
auto id = std::get<0>(record);
auto name = std::get<1>(record);// C++17 結構化綁定
auto [id, name, score] = record;

3. std::array (C++11)

用途:固定大小的同質數組(棧分配)
特點:
替代傳統 C 風格數組
支持迭代器和標準容器操作
編譯時已知大小

#include <array>std::array<int, 5> numbers = {1, 2, 3, 4, 5};// 訪問元素
for (int n : numbers) {std::cout << n << " ";
}// 編譯時大小檢查
static_assert(numbers.size() == 5);

4. std::vector (C++98)

用途:動態大小的同質數組(堆分配)
特點:
最常用的順序容器
自動內存管理
隨機訪問 O(1)
尾部插入/刪除高效

#include <vector>std::vector<std::string> names = {"Alice", "Bob", "Charlie"};// 添加元素
names.push_back("David");// 訪問元素
std::cout << names[1]; // 輸出 "Bob"

二、高級組合結構

5. std::variant (C++17)

用途:類型安全的聯合體(存儲多個類型中的一個)
特點:
替代 union 的安全方案
值語義(非指針)
可包含復雜類型(字符串、容器等)

#include <variant>using Value = std::variant<int, double, std::string>;Value v1 = 42;
Value v2 = 3.14;
Value v3 = "Hello";// 訪問值
std::visit([](auto&& arg) {std::cout << arg;
}, v3);// 檢查當前類型
if (std::holds_alternative<int>(v1)) {std::cout << "Integer: " << std::get<int>(v1);
}

6. std::any (C++17)

用途:存儲任意類型的單個值
特點:
類似腳本語言的動態類型
運行時類型檢查
需要顯式類型轉換

#include <any>std::any data;
data = 42;                     // 存儲 int
data = std::string("Hello");   // 替換為 string// 安全訪問
try {std::string s = std::any_cast<std::string>(data);
} catch (const std::bad_any_cast& e) {std::cerr << "Wrong type: " << e.what();
}

7. std::optional (C++17)

用途:表示可選值(可能有值或為空)
特點:
替代指針或特殊值(如 -1)表示缺失值
明確表達"可能有值"的語義
避免空指針異常

#include <optional>std::optional<int> findValue(const std::vector<int>& vec, int target) {for (int v : vec) {if (v == target) return v;}return std::nullopt; // 空值
}// 使用
auto result = findValue({1,2,3}, 2);
if (result) {std::cout << "Found: " << *result;
} else {std::cout << "Not found";
}

三、復合數據結構

8. 嵌套容器

用途:創建多維或復雜數據結構
常見組合:

// 二維數組
std::vector<std::vector<int>> matrix = {{1, 2, 3},{4, 5, 6}
};// 字典列表
std::map<std::string, std::vector<double>> studentGrades = {{"Alice", {95.5, 88.0}},{"Bob", {78.5, 92.0}}
};// 元組集合
std::set<std::tuple<int, int, int>> uniquePoints;

9. 結構體綁定

用途:組合相關數據字段
特點:
優于 std::pair/std::tuple 的語義清晰性
支持成員函數和自定義行為

struct Person {std::string name;int age;std::vector<std::string> hobbies;
};Person alice{"Alice", 30, {"Reading", "Hiking"}};// C++17 結構化綁定
auto [name, age, hobbies] = alice;

四、數據結構對比指南

在這里插入圖片描述

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

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

相關文章

深入解析C++ STL鏈表(List)模擬實現

目錄 一、需要實現的三個類及其成員函數接口 二、結點類的模擬實現 構造函數 三、迭代器類的模擬實現 1、迭代器類的作用 2、迭代器類模板參數說明 3、構造函數 4、前置運算符重載 5、后置運算符重載 6、前置 -- 運算符重載 7、后置 -- 運算符重載 8、運算符重載 …

將mysql數據庫表結構導出成DBML格式

前言 DBML&#xff08;數據庫標記語言&#xff09;是一種簡單易讀的 DSL 語言&#xff0c;用于定義數據庫結構。 因為需要分析商品模塊的表設計是否合理&#xff0c;所以需要圖形化表&#xff0c;并顯示表之前的關系。 想來想去&#xff0c;找到了DBML。所以就需要將數據庫結構…

玩轉tokenizer

&#x1f31f; 案例 1&#xff1a;加載現成的 BERT 分詞器from tokenizers import Tokenizer# 加載一個預訓練的 BERT tokenizer&#xff08;文件需要提前下載&#xff0c;比如bert-base-uncased&#xff09; tokenizer Tokenizer.from_file("bert-base-uncased-tokenize…

Day53--圖論--106. 島嶼的周長(卡碼網),110. 字符串接龍(卡碼網),105. 有向圖的完全聯通(卡碼網)

Day53–圖論–106. 島嶼的周長&#xff08;卡碼網&#xff09;&#xff0c;110. 字符串接龍&#xff08;卡碼網&#xff09;&#xff0c;105. 有向圖的完全聯通&#xff08;卡碼網&#xff09; 106. 島嶼的周長&#xff08;卡碼網&#xff09; 方法&#xff1a;深搜 思路&am…

Elasticsearch 數據建模與映射(Mapping)詳解

在 Elasticsearch 中&#xff0c;數據建模與映射&#xff08;Mapping&#xff09; 是決定搜索性能、存儲效率和功能支持的核心環節。合理的映射設計能讓搜索更精準、聚合更高效、存儲更節省。 本文將全面詳解 Elasticsearch 的 數據建模原則、字段類型、動態映射、自定義分析器…

5G工業一體機汽車零部件工廠的無紙化管理

在全球數字化轉型的浪潮中&#xff0c;制造業對信息化、智能化的需求日益強烈。尤其是在汽車零部件領域&#xff0c;生產線的復雜性、質量追溯的苛刻性以及對效率的高要求&#xff0c;迫切需要一種高效、可靠、可擴展的管理模式。以“5G工業一體機”為核心的無紙化管理&#xf…

項目管理工具

1、概述IT 項目生命周期通常可分為啟動、規劃、執行、監控與控制、收尾五個核心階段&#xff0c;每個階段的目標和任務不同&#xff0c;所依賴的工具也各有側重。以下按階段梳理常用工具&#xff0c;涵蓋項目管理、協作、技術開發等多個維度。2、啟動階段&#xff1a;明確項目目…

Linux 進程、線程與 exec/系統調用詳解

1. wait 與 waitpid —— 子進程資源回收1.1 waitpid_t wait(int *wstatus);功能&#xff1a;阻塞等待&#xff0c;回收任意子進程的資源空間。參數&#xff1a;wstatus&#xff1a;保存子進程退出狀態的變量地址NULL&#xff1a;不保存退出狀態返回值&#xff1a;成功&#xf…

Laravel 使用ssh鏈接遠程數據庫

1.創建ssh ssh -i ./id_rsa -N -L 13306:127.0.0.1:3306 -p 22 root***對上述代碼的解釋&#xff1a; 命令是一個SSH隧道命令&#xff0c;用于將本地端口3306轉發到遠程服務器上的3306端口。以下是命令的詳細解釋&#xff1a;# 調用SSH客戶端。 ssh # 指定用于身份驗證的私鑰文…

Python延申內容(一)

1.技術面試題 &#xff08;1&#xff09;TCP與UDP的區別是什么&#xff1f; 答&#xff1a; TCP&#xff08;傳輸控制協議&#xff09;&#xff1a;面向連接、可靠傳輸&#xff08;數據完整有序&#xff09;、流量控制、擁塞控制&#xff0c;適用于文件傳輸、網頁瀏覽等場景。 …

Java 9 新特性及具體應用

目錄 1. 模塊系統&#xff08;Jigsaw&#xff09; 2. JShell&#xff08;REPL工具&#xff09; 3. 集合工廠方法 4. 接口私有方法 5. Stream API 增強 6. HTTP/2 客戶端&#xff08;Incubator&#xff09; 7. 多版本JAR包 總結 1. 模塊系統&#xff08;Jigsaw&#xff0…

第二十五天:構造函數/析構函數/拷貝構造

構造函數/析構函數/拷貝構造 1. 構造函數&#xff08;Constructor&#xff09; 定義與作用&#xff1a;構造函數是一種特殊的成員函數&#xff0c;其名稱與類名相同&#xff0c;沒有返回類型&#xff08;包括 void 也沒有&#xff09;。它的主要作用是在創建對象時初始化對象的…

【P14 3-6 】OpenCV Python——視頻加載、攝像頭調用、視頻基本信息獲取(寬、高、幀率、總幀數),視頻保存在指定位置

文章目錄1 讀取本地視頻1.1 絕對路徑 6種方式1.2 相對路徑 4種方式1.3 讀取本地視頻2 視頻基本信息3 調用攝像頭 并將視頻保存在指定位置P14 3-6 1 讀取本地視頻 現在要讀取本地視頻“video.mp4”&#xff0c; 視頻文件“video.mp4”和playVideo.py腳本文件&#xff0c;都在…

【DL學習筆記】常用數據集總結

一、如何找數據集 paperswithcode&#xff0c;但好像沒了 AutoDL Roboflow Kaggle Hungging Face 百度飛漿PP AIStudio 二、目標檢測數據集格式 常用數據集坐標格式 MSCOCO &#xff1a; 坐標格式&#xff08;x&#xff0c;y&#xff0c;w&#xff0c;h&#xff…

19.3 Transformers量化模型極速加載指南:4倍推理加速+75%顯存節省實戰

Transformers量化模型極速加載指南:4倍推理加速+75%顯存節省實戰 實戰項目:模型量化 Transformers 兼容性配置 量化模型加載核心配置邏輯 #mermaid-svg-rDjfMigtxckLYWp3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#merm…

Android 終端接入 GB28181 國標視頻平臺的完整解決方案解析

1. 引言&#xff1a;讓 Android 終端無縫融入國標視頻網絡在公安、交通、應急、工業、教育等領域&#xff0c;GB/T 28181 國標協議早已成為視頻監控與指揮調度的事實標準。傳統國標視頻網絡通常由固定部署的 IPC 攝像機、NVR、視頻管理平臺構成&#xff0c;設備形態單一。隨著一…

Docker目錄的遷移

# 遷移 docker 目錄 &#xff08;無論容器與鏡像占用空間大小&#xff0c;哪怕只占用1G&#xff0c;也需用此方式&#xff0c;否則可能遷移不成功&#xff09;service docker stopcd /var/lib/docker# 一個一個復制除 overlay2 外的其他所有文件夾cp -R builder /home/docker/l…

IOS APP 前端存儲

UserDefaults優點簡單易用提供簡單的鍵值對存儲接口無需復雜配置&#xff0c;開箱即用適合存儲少量簡單數據輕量級專門為存儲小量數據設計內存占用小性能開銷低自動持久化數據自動保存到磁盤應用重啟后數據仍然可用通過synchronize()方法可以強制立即寫入&#xff08;iOS 12已自…

在前端js中使用jsPDF或react-to-pdf生成pdf文件時,不使用默認下載,而是存儲到服務器

開源地址&#xff1a; https://github.com/ivmarcos/react-to-pdf 主要就是這個方法&#xff0c;有三種可選&#xff1a; 默認是save&#xff0c;也就是會自動觸發下載的方法&#xff0c;open方法是默認會打開一個pdf預覽的tab頁面&#xff0c;build方法就是在調用的函數gener…

會議征稿!IOP出版|第二屆人工智能、光電子學與光學技術國際研討會(AIOT2025)

往屆已EI檢索&#xff0c;歡迎投稿&#xff01; AIOT2024會后兩個月實現見刊&#xff01; AIOT2025已通過IOP-JPCS出版申請&#xff0c;獨立JPCS出版 AIOT2025已上線西安文理學院官網&#xff1a; 征文通知&#xff5c;第二屆人工智能、光電子學與光學技術國際…