C++ 中 std::tuple 使用詳解

C++ 中 std::tuple 使用詳解

基本概念

std::tuple 是 C++11 引入的模板類,用于打包任意數量、任意類型的值在一起。可看作是類型安全的變長結構體。

#include <tuple>std::tuple<int, std::string, double> t(42, "hello", 3.14);

創建 tuple 的方法

auto t1 = std::make_tuple(1, 2.5, "abc");       // 自動推導類型
std::tuple<int, float, const char*> t2(1, 2.5f, "abc");

std::make_tuple 會自動進行類型推導和轉化。


訪問元素:std::get<>

#include <iostream>std::tuple<int, std::string, double> t(1, "hi", 3.14);
std::cout << std::get<1>(t) << std::endl;  // 輸出 "hi"

注意:必須使用編譯期常量作為索引,不能傳運行時變量!


獲取類型 & 大小

#include <tuple>
#include <type_traits>using MyTuple = std::tuple<int, float, std::string>;constexpr std::size_t size = std::tuple_size<MyTuple>::value;
using T1 = std::tuple_element<1, MyTuple>::type;  // float

修改元素值

std::get<2>(t) = 6.28;  // 修改 double 類型的值

拆解 tuple(結構化綁定)

C++17 提供結構化綁定:

auto [x, y, z] = t;  // 自動展開為三個變量

tuple 的比較、賦值

std::tuple<int, int> a(1, 2), b(1, 3);
if (a < b) std::cout << "a < b";  // 支持逐元素比較

高級技巧:遞歸訪問 tuple

遍歷 tuple 中所有元素(使用模板遞歸)

#include <iostream>
#include <tuple>template<std::size_t I = 0, typename... Ts>
void print_tuple(const std::tuple<Ts...>& t) {if constexpr (I < sizeof...(Ts)) {std::cout << std::get<I>(t) << " ";print_tuple<I + 1>(t);}
}int main() {auto t = std::make_tuple(1, 3.14, "hello");print_tuple(t);  // 輸出: 1 3.14 hello
}

對每個元素執行函數(C++17 fold expression

template<typename... Ts>
void apply_to_each(const std::tuple<Ts...>& t) {std::apply([](const auto&... args) {((std::cout << args << " "), ...);}, t);
}

根據類型訪問 tuple 元素(要求類型唯一)

template<typename T, typename... Ts>
T& get_by_type(std::tuple<Ts...>& t) {return std::get<T>(t);
}std::tuple<int, double, std::string> t{42, 3.14, "hi"};
auto& str = get_by_type<std::string>(t);  // OK

?? 不能有多個相同類型,否則編譯失敗!


std::tie 結合解包、忽略元素

int a; std::string b;
std::tuple<int, std::string, double> t{10, "hi", 3.14};std::tie(a, b, std::ignore) = t;  // 忽略第三個元素

tuple 的拼接:std::tuple_cat

auto t1 = std::make_tuple(1, "x");
auto t2 = std::make_tuple(3.14, false);
auto t3 = std::tuple_cat(t1, t2);  // 拼接 tuple

注意事項

  1. std::get<index>(tuple) 的 index 必須是 編譯時常量
  2. 用類型訪問元素(std::get<T>)時類型必須唯一。
  3. tuple 不支持運行時下標訪問(不像 vector)。
  4. 不適用于極大量元素(模板編譯速度會極慢)。
  5. std::apply 是處理 tuple 和函數調用結合的利器(見下節)。

函數調用 + tuple 參數展開:std::apply

#include <tuple>void func(int a, double b, const std::string& c) {std::cout << a << ", " << b << ", " << c << "\n";
}int main() {auto t = std::make_tuple(1, 3.14, "hello"s);std::apply(func, t);  // 自動解包調用 func
}

實戰示例:遞歸地對 tuple 中所有值加倍

template <std::size_t I = 0, typename... Ts>
void double_tuple(std::tuple<Ts...>& t) {if constexpr (I < sizeof...(Ts)) {std::get<I>(t) *= 2;double_tuple<I + 1>(t);}
}

適用于所有支持 *= 操作的類型。


小結

功能工具
構造 tuplestd::make_tuple, 構造函數
訪問元素std::get<index>, std::get<T>
獲取信息std::tuple_size, std::tuple_element
遍歷元素模板遞歸 / std::apply + fold
類型安全調用std::apply(func, tuple)
拼接std::tuple_cat
解包C++17 結構化綁定、std::tie
忽略元素std::ignore

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

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

相關文章

WebRTC基于網頁的視頻會議,手寫WebRTC流程(html)

WebRTC是web real-time communication網頁及時通信的縮寫&#xff0c;通過javascript就可以實現網頁會話&#xff0c;基于瀏覽器開發出來多媒體應用&#xff0c; 以下是手寫的WEBRTC調用本地攝像頭的html代碼&#xff0c;直接用瀏覽器打開&#xff0c;就可以使用 <!DOCTYPE…

MyBatis 官方子項目詳細說明及表格總結

MyBatis 官方子項目詳細說明及表格總結 1. 核心子項目說明 1.1 mybatis-3 GitHub 鏈接&#xff1a;https://github.com/mybatis/mybatis-3功能&#xff1a; MyBatis 核心框架的源碼&#xff0c;提供 SQL 映射、動態 SQL、緩存、事務管理等核心功能。主要功能&#xff1a; 支持…

【虛幻C++筆記】碰撞檢測

目錄 碰撞檢測參數詳情示例用法 碰撞檢測 顯示名稱中文名稱CSphere Trace By Channel按通道進行球體追蹤UKismetSystemLibrary::SphereTraceSingleSphere Trace By Profile按描述文件進行球體追蹤UKismetSystemLibrary::SphereTraceSingleByProfileSphere Trace For Objects針…

推論階梯——AI與思維模型【81】

一、定義 推論階梯思維模型是一種用于分析和理解人們如何從觀察到的事實,經過一系列的假設、推理和判斷,最終得出結論的思維過程的理論框架。它將這個過程比喻為一個階梯,每一步都建立在前一步的基礎上,逐漸形成一個完整的推論。這個模型幫助我們意識到在思考和決策過程中…

小剛說C語言刷題——1109加密四位數

1.題目描述 某軍事單位用 4位整數來傳遞信息&#xff0c;傳遞之前要求先對這個 4 位數進行加密。加密的方式是每一位都先加上 5然后對 10取余數&#xff0c;再將得到的新數顛倒過來。 例如&#xff1a;原數是 1379 &#xff0c;那么每位加 55對 10 取余數的結果為 6824 &…

云服務器和獨立服務器的區別在哪

在當今數字化的時代&#xff0c;服務器成為了支撐各種業務和應用的重要基石。而在服務器的領域中&#xff0c;云服務器和獨立服務器是兩個備受關注的選項。那么&#xff0c;它們到底有何區別呢&#xff1f; 首先&#xff0c;讓我們來聊聊成本。云服務器通常采用按需付費的模式…

【前端】【業務場景】【面試】在前端開發中,如何優化 SVG(可縮放矢量圖形)的性能,特別是在處理復雜圖形和動畫時

SVG?性能優化&#xff1a;循序漸進 4?步法 目標&#xff1a;先減負 → 再復用 → 后加速 → 最后按場景微調 ①?精簡—把包袱先丟掉 刪除無用元素 隱藏/被遮擋的 <path>、未引用的 <defs> 里漸變、濾鏡。 合并路徑 同填充色或描邊的路徑 ? SVGO / SVGOMG「Mer…

MySQL長事務的隱患:深入剖析與解決方案

MySQL長事務的隱患&#xff1a;深入剖析與解決方案 一、什么是長事務&#xff1f; 在數據庫系統中&#xff0c;長事務(Long Transaction)通常指執行時間超過預期或系統設定閾值的事務。對于MySQL而言&#xff0c;雖然沒有嚴格的時間定義&#xff0c;但一般認為執行時間超過數…

華為AR1200 telnet設置

華為路由配置TELNET登 &#x1f4fa; 啟動TELNET服務 在華為路由器上啟動TELNET服務&#xff0c;執行以下命令&#xff1a; telnet server enable &#x1f511; 配置AAA認證 進入AAA認證配置&#xff0c;創建一個路由器登錄帳號admin123&#xff0c;并設置密碼為huawei123&…

【Token系列】01 | Token不是詞:GPT如何切分語言的最小單元

文章目錄 01 | Token不是詞&#xff1a;GPT如何切分語言的最小單元&#xff1f;一、什么是 Token&#xff1f;二、Token 是怎么來的&#xff1f;——BPE算法原理BPE核心步驟&#xff1a; 三、為什么不直接用詞或字符&#xff1f;四、Token切分的實際影響五、中文Token的特殊性六…

如何快速高效學習Python?

如何快速高效學習Python&#xff1f; How to Fastly and Effectively Learn Python Programming? By JacksonML 1. Python年輕嗎&#xff1f; Python自1991年誕生到現在&#xff0c;已經經歷了三十四年或者更長時間了。畢竟&#xff0c;Python之父 – 吉多范羅蘇姆先生(Gu…

NAT穿透

NAT是 Net Address Traslation的縮寫&#xff0c;即網絡地址轉換 NAT部署在網絡出口的位置。位于內網和公網之間&#xff0c;是連接內挖個主機和公網的橋梁&#xff0c;雙向流量都必須經過NAT&#xff0c;裝有NAT軟件的路由器叫NAT路由器&#xff0c;NAT路由器擁有公網Ip NAT解…

搜索引擎的高級語法

文章目錄 精確搜索&#xff1a;雙引號站內搜索&#xff1a;site通配符搜索&#xff1a;*減號縮小范圍&#xff1a;-文檔搜索&#xff1a;filetypeURL搜索&#xff1a; inurl標題搜索&#xff1a;intitle正文搜索&#xff1a;intext參考鏈接 精確搜索&#xff1a;雙引號 “ ” …

RAG vs 微調:大模型知識更新的最優解之爭

一、技術本質&#xff1a;知識注入的兩條路徑 在大模型應用落地的實踐中&#xff0c;RAG&#xff08;檢索增強生成&#xff09;與微調&#xff08;Fine-tuning&#xff09;已成為知識更新的兩大核心技術路徑。二者的本質差異在于是否對模型參數進行修改&#xff1a; 維度RAG微…

解釋器體系結構風格-筆記

解釋器&#xff08;Interpreter&#xff09;是一種軟件設計模式或體系結構風格&#xff0c;主要用于為語言&#xff08;或表達式&#xff09;定義其語法、語義&#xff0c;并通過解釋器來解析和執行語言中的表達式。解釋器體系結構風格廣泛應用于編程語言、腳本語言、規則引擎、…

瀏覽器f12可以搜索接口的入參 和返回內容

瀏覽器f12可以搜索接口的入參 和返回內容

vue3+element-push 實現input框粘貼圖片或文本,圖片上傳。

vue3element-push 實現input框粘貼圖片或文本&#xff0c;圖片上傳。 <el-inputstyle"height: 100px; width: 100%"paste.capture.prevent"pasting"v-model"textMsg"placeholder"請輸入"/>// 展示上傳的列表--可不要<divsty…

高效使用DeepSeek對“情境+ 對象 +問題“型課題進行開題!

目錄 思路"情境 對象 問題"型 課題選題的類型有哪些呢&#xff1f;這要從課題題目的構成說起。通過對歷年來國家社會科學基金立項項目進行分析&#xff0c;小編發現&#xff0c;課題選題類型非常豐富&#xff0c;但一般是圍繞限定詞、研究對象和研究問題進行不同的組…

cursor改Goland操作習慣

步驟1&#xff1a;設置主題 步驟2&#xff1a;安裝最新go插件 步驟3&#xff1a;安裝最新go版本 需要使用最新版本go1.24.1,設置玩環境變量&#xff0c;需要關閉cursor進程再打開 步驟4&#xff1a;安裝go相關工具 Command Shift P安裝完成后需要把go版本設置回自己項目合…

4.1.1 類的序列化與反序列化(XmlSerializer)

本文介紹XML序列化和反序列化操作 本例子中被序列化的類(Devices)中有一個List,其元素類型為&#xff1a;DigitalInputInfo. 序列化以及反序列化都很簡單&#xff1a; 序列化&#xff1a;即把類的對象輸出到文件中。 StreamWriter streamWriter new StreamWriter(filePath); …