结构体的嵌套与复杂数据组织

在C++中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系:

struct Address {string city;string street;int zipCode;
};struct Employee {string name;int id;Address address;  // 嵌套结构体
};

通过嵌套,可以清晰地表达数据之间的逻辑关联,适合处理如学生信息(包含成绩、联系方式等子结构)或游戏实体(包含位置、属性等子结构)的场景。


结构体与函数结合

结构体可以与函数结合,实现数据与操作的封装。例如为结构体定义成员函数:

struct Rectangle {double width;double height;double area() { return width * height; }  // 成员函数
};

这种方式增强了结构体的功能性,使其接近类的特性。注意:在C++中,结构体默认成员为public,而类为private


结构体与指针的动态操作

结构体指针常用于动态内存分配和链表等数据结构:

struct Node {int data;Node* next;  // 指向自身类型的指针
};// 动态创建结构体实例
Node* head = new Node{10, nullptr};

通过指针可以实现链式结构(如链表、树),需注意内存管理,避免泄漏(建议搭配智能指针使用)。


结构体对齐与内存优化

结构体的内存布局受对齐规则影响,可通过#pragma packalignas手动控制:

#pragma pack(push, 1)  // 1字节对齐
struct PackedData {char a;int b;
};
#pragma pack(pop)      // 恢复默认对齐

优化对齐减少内存浪费,尤其在网络传输或硬件交互时需考虑平台兼容性。


结构体与STL容器结合

结构体可作为STL容器的元素,例如vectormap

struct Student {string name;int score;
};vector<Student> students = {{"Alice", 90}, {"Bob", 85}};
sort(students.begin(), students.end(), [](const Student& a, const Student& b) { return a.score > b.score; });

通过自定义排序或哈希函数(用于unordered_map),结构体在STL中能高效处理复杂数据集合。


结构体的高级初始化技巧

C++11后支持成员初始化列表和聚合初始化:

struct Point {int x = 0;  // 默认值int y = 0;
};Point p1{1, 2};       // 聚合初始化
Point p2 = {.x = 3};  // C++20指定成员初始化

此特性简化了初始化代码,尤其适用于可选字段较多的场景(如配置参数)。


结构体与元编程

通过模板和constexpr,结构体可用于编译时计算:

template<typename T>
struct TypeSize {static constexpr size_t value = sizeof(T);
};constexpr size_t intSize = TypeSize<int>::value;  // 编译时获取大小

结合模板元编程,结构体能实现类型萃取等高级功能,增强代码泛用性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/86555.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/86555.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/86555.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode题解450:删除BST中的结点!调整二叉树的结构最难!

一、题目内容 题目要求删除二叉搜索树&#xff08;BST&#xff09;中值为 key 的节点&#xff0c;并保证删除后二叉搜索树的性质不变。返回删除节点后的二叉搜索树的根节点的引用。一般来说&#xff0c;删除节点可分为两个步骤&#xff1a;首先找到需要删除的节点&#xff1b;如…

让 Kubernetes (K8s) 集群 使用 GPU

要让 Kubernetes (K8s) 集群 使用 GPU&#xff0c;并且节点是 KVM 虚拟化 出来的&#xff0c;需要确保以下几点&#xff1a; KVM 虚拟机透传 GPU&#xff08;PCIe Passthrough&#xff09; 宿主机和 K8s 节点正确安装 NVIDIA 驱动 K8s 集群安装 nvidia-device-plugin Pod 配…

Android第十七次面试总结(Java数据结构)

一、Java 集合体系核心架构与高频考点 1. 集合体系架构图 Java集合框架 ├─ Collection&#xff08;单列集合&#xff09; │ ├─ List&#xff08;有序、可重复&#xff09; │ │ ├─ ArrayList&#xff08;动态数组&#xff0c;随机访问快&#xff09; │ │ ├─…

Linux 删除登录痕迹

本文介绍相对彻底的删除 Linux 的登录痕迹&#xff0c;操作前确保已经可以拿到能提权ROOT令牌的系统管理权限。 当然&#xff0c;仍可以先查阅以下文章。 Linux 删除用户终端命令行操作记录-CSDN博客 1、清楚当前会话记录 history -c # 清空当前终端内存中的历史命令 2、永…

Lighttpd 配置选项介绍

根据提供的 Lighttpd 配置选项文档&#xff08;https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ConfigurationOptions &#xff09;&#xff0c;以下是所有配置选项的详细解释、作用及适用场景&#xff0c;按模块分组说明&#xff1a; 以下是对 Lighttpd 配置选项 …

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…

Python 训练营打卡 Day 40-训练和测试的规范写法

一.单通道图片的规范写法 以之前的MNIST数据集为例 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader , Dataset # DataLoader 是 PyTorch 中用于加载数据的工具 from torchvision import datasets, transforms # t…

Java 枚举(Enum)的使用说明

在 Java 中&#xff0c;枚举&#xff08;Enum&#xff09;是一种特殊的数据类型&#xff0c;用于定义一组固定的命名常量。它比传统的常量&#xff08;如 public static final&#xff09;更安全、更灵活&#xff0c;且支持面向对象特性。以下是枚举的详细用法&#xff1a; 1. …

Docker部署Nginx-UI

使用如下命令拉取运行nginx-ui软件 docker run -dit \ --namenginx-ui \ --restartalways \ -e TZAsia/Shanghai \ -v /mnt/user/appdata/nginx:/etc/nginx \ -v /mnt/user/appdata/nginx-ui:/etc/nginx-ui \ -v /var/run/docker.sock:/var/run/docker.sock \ -…

OkHttp 3.0源码解析:从设计理念到核心实现

本文通过深入分析OkHttp 3.0源码&#xff0c;揭示其高效HTTP客户端的实现奥秘&#xff0c;包含核心设计理念、关键组件解析、完整工作流程及实用技巧。 一、引言&#xff1a;为什么选择OkHttp&#xff1f; 在Android和Java生态中&#xff0c;OkHttp已成为HTTP客户端的标准选择…

洛谷P12170 [蓝桥杯 2025 省 Python B] 攻击次数

题目传送门 思路 首先定义一个数 n n n ,初值为 2025 2025 2025,从第一回合开始,三个英雄持续攻击,攻击方式为: 第一个英雄: 每回合攻击 5 5 5

百度之星2021——BD202104 萌新

输入格式&#xff1a; 本题有多组测试数据。 第一行一个数 T (1 ≤ T ≤ 1000) 表示一共有 T 组数据。对于每一组数据&#xff0c;输入一行两个数 a,b (1 ≤ a,b ≤ 1000000000)。 输出格式&#xff1a; 对每组数据&#xff0c;输出一行两个数分别表示最小与最大的 c&#xff0…

R语言ICU患者死亡率预测实战

【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) 预测ICU患者死亡率对比较药物的疗效、比较护理的有效性、比较手术的有效性有重要意义&#xff0c;利用机…

leetcode240-搜索二维矩阵

leetcode 240 思路 1. 矩阵特性 首先&#xff0c;利用矩阵的特性是解题的关键&#xff1a; 每行的元素递增每列的元素递增 这意味着&#xff0c;如果我们在矩阵中从右上角或左下角开始搜索&#xff0c;可以有效缩小搜索范围 2. 从右上角开始搜索 将搜索的起点定位在矩阵…

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…

【web应用】若依框架:若依框架中的页面跳转简介

文章目录 ⭐前言1. 后端控制器跳转2. 前端路由跳转3. 菜单配置跳转4. 权限控制跳转5. 常见跳转路径 ⭐一、主目录页面跳转⭐二、菜单目录跳转⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内容开源、框架、软件工程、全栈&#x…

MS9292+MS9332 HD/DVI转VGA转换器+HD环出带音频

MS9292MS9332是一款HD/DVI转VGA转换器HD环出带音频的视频转换方案。支持HD/DVI输入&#xff0c;VGA输出和HD环出&#xff0c;HD/DVI输入最高支持1920120060Hz&#xff0c;VGA输出最高支持1920120060Hz&#xff0c;HD环出最高支持4K30Hz。该方案已实现量产&#xff0c;并提供完善…

C++初阶-list的模拟实现(难度较高)

1.list&#xff08;容器&#xff0c;不是类&#xff09;模拟实现基本结构 这个实现是和源码的实现不同的&#xff0c;不要进行强制类型转换了&#xff0c;很麻烦。我们把定义放在.h文件中&#xff0c;在.cpp中放测试代码。 注&#xff1a;这个基本结构之后会改变&#xff0c;…

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…

【iOS】cell的复用以及自定义cell

【iOS】cell的复用以及自定义cell 文章目录 【iOS】cell的复用以及自定义cell前言cell的复用手动&#xff08;非注册&#xff09;自动&#xff08;注册&#xff09; 自定义cell 前言 cell的复用及自定义cell是UITableView或UICollectionView的一个重要优化机制,当用户滚动视图…