在 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;第二届人工智能、光电子学与光学技术国际…