Cherno C++学习笔记 P52 处理多返回值

news2025/1/15 11:31:19

在这篇文章当中,我们解决一下如何用C++的函数处理多返回值的问题。

在有些情况下,我们希望我们的函数可以返回多个返回值,比如返回两个string或者是一个int加上一个string。如果我们用的是python之类的语言的话,那这个事情其实是很好实现的。但是因为我们用的是C++,而C++本身是不支持我们一个函数返回两个类型的变量的。当然如果是一个类型的话,那确实容易一些,我们可以使用array/vector这些容器来装下这多个同类型的变量,比如这里我们举一个简单的例子,返回多个我们定义的Vertex类型组成的vector:

#include<iostream>
#include<string>
#include<vector>

struct Vertex {
public:
    float x, y, z;
public:
    Vertex(float x, float y, float z)
        :x(x), y(y), z(z){}
};

static std::vector<Vertex> function() {
    Vertex v1(2.0f, 1.0f, 0.5f);
    Vertex v2(-2.0f, 1.6f, 0.7f);
    std::vector<Vertex> vertices{ v1, v2 };
    return vertices;
}

当然,实际上我们也可以使用静态数组array,但是因为array建立在栈上,而vertex是建立在堆上,所以严格来说,使用array性能会更好一些。 

但是如果我们想要返回两个类型,比如一个int和一个Vertex这类的话,我们应该怎么做?一种解决办法是,讲两种类型放入到一个struct当中,然后我们的函数返回这个struct:

struct Vertex {
public:
    float x, y, z;
public:
    Vertex(float x, float y, float z)
        :x(x), y(y), z(z){}
};

struct Combine {
public:
    int dimension;
    Vertex v;
public:
    Combine(int a, Vertex v)
        :dimension(a), v(v){}
};

static Combine function() {
    int d = 3;
    Vertex v(2.0f, 1.0f, 0.9f);
    Combine rtn(d, v);
    return rtn;
}

我们可以看到,这样我们就做到了返回两个类型的变量组成的结构体,达到了我们想要返回多个变量的目的。这也是Cherno自己最喜欢的方法。

除了这个方法之外,还可以用另一个方法,这个也是很多实践场合会使用的办法,就是把函数改成void,然后输入变量改成引用,这样我们就可以用修改引用的方法修改外面已经定义好的量,这样就实现了我们函数修改变量的功能。

static void function(int& dimen, Vertex& vertex) {
    int d = 3;
    Vertex v(2.0f, 1.0f, 0.9f);
    dimen = d;
    vertex = v;
}

这样的话我们的变量的内存是预分配的,而不需要在函数内部分配。从技术上来讲,这有可能是最理想的方式,因为没有复制发生,我们直接修改了在函数外面的变量,所以其实是可以最快的。同样的,这也是一种输出不同类型变量的风格,在给变量起名字的时候,我们可以给预计要输出的变量添加一个out前缀,来表明这些其实是我们这个函数的输出变量。

当然除了引用之外,我们还可以给函数输入指针,来达到类似的效果。不过区别在于,在使用指针的时候,我们可以通过给一个nullptr来表示我们不想返回这个变量,但是引用却必须要引用某一个变量才能返回。

那么C++有没有给我们一些容器可以让我们塞入不同类型的数据呢?也是有的,那就是tuple,可以让我们放入不同类型的数据,使用方法如下:

static std::tuple<int, Vertex> function() {
    int d = 3;
    Vertex v(2.0f, 1.0f, 0.9f);
    std::tuple<int, Vertex> t(d, v);
    return t;
}

但是这个其实是非常讨厌的,因为当我们想要获取里面的数值的时候,会发现非常的麻烦:

auto t = function();
std::cout << std::get<0>(t) << std::endl;

我们不得不使用这种方式,那么什么是0?什么是1?它们具体指代的是什么?这个其实是很混淆的,我们是不知道的。这就会大大降低我们代码的可读性。

另一个可以采用的是pair,使用方法如下:

static std::pair<int, Vertex> function() {
    int d = 3;
    Vertex v(2.0f, 1.0f, 0.9f);
    auto p = std::pair<int, Vertex>(d, v);
    return p;
}
auto p = function();
std::cout << p.first << std::endl;

我们可以看到我们能使用first和second这样的字眼,相对好一点,但是好的不多。而在我们使用struct的时候,我们处理的是名字而不是数字或者first之类的,所以采用struct确实是更好的方法。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Flink】Flink内存管理

Flink内存整体结构图&#xff1a; JobManager内存管理 JVM 进程总内存(Total Process Memory)Flink总内存(Total Flink Memory)&#xff1a;JVM进程总内存减去JVM Metaspace(元空间)和JVM Overhead(运行时开销)上图解释&#xff1a; JVM进程总内存为2G;JVM运行时开销(JVM Overh…

如何规模化实现完全自动驾驶?Mobileye提出解题“新”思路

在CES 2025上&#xff0c;Mobileye展示了端到端自动驾驶系统Mobileye Drive™&#xff0c;通过高度集成的传感器、算法和计算平台&#xff0c;可以实现自动驾驶功能的全覆盖。 Mobileye创始人兼首席执行官Amnon Shashua教授 期间&#xff0c;Mobileye创始人兼首席执行官Amnon …

Qt 5.14.2 学习记录 —— 십일 QLCDNumber、QProgressBar、QCalendarWidget

文章目录 1、QLCDNumber2、ProgressBar3、QCalendarWidget 1、QLCDNumber 写一个倒计时程序。拖一个LCD Number到界面&#xff1a; 定时器用Qt的QTimer类&#xff0c;这个类的对象会产生一个timeout信号&#xff0c;通过start方法来开启定时器&#xff0c;并且参数中设定触发ti…

简要认识JAVAWeb技术三剑客:HTMLCSSJavaScript

目录 一、web标准二、什么是HTML三、什么是CSS四、什么是JavaScript 黑马JAVAWeb飞书在线讲义地址&#xff1a; https://heuqqdmbyk.feishu.cn/wiki/LYVswfK4eigRIhkW0pvcqgH9nWd 一、web标准 Web标准也称网页标准&#xff0c;由一系列的标准组成&#xff0c;大部分由W3C&…

sosadmin相关命令

sosadmin命令 以下是本人翻译的官方文档&#xff0c;如有不对&#xff0c;还请指出&#xff0c;引用请标明出处。 原本有个对应表可以跳转的&#xff0c;但是CSDN的这个[](#)跳转好像不太一样&#xff0c;必须得用html标签&#xff0c;就懒得改了。 sosadmin help 用法 sosadm…

【C语言】字符串函数详解

文章目录 Ⅰ. strcpy -- 字符串拷贝1、函数介绍2、模拟实现 Ⅱ. strcat -- 字符串追加1、函数介绍2、模拟实现 Ⅲ. strcmp -- 字符串比较1、函数介绍2、模拟实现 Ⅳ. strncpy、strncat、strncmp -- 可限制操作长度Ⅴ. strlen -- 求字符串长度1、函数介绍2、模拟实现&#xff08…

IO进程day6

一、思维导图 二、练习题1 有一个隧道&#xff0c;长1000m&#xff0c;有一辆高铁&#xff0c;每秒100米&#xff0c;有一辆快车&#xff0c;每秒50m 要求模拟这两列火车通过隧道的场景。 #include <stdio.h> #include <unistd.h> #include <pthread.h>pthre…

手撕代码: C++实现按位序列化和反序列化

目录 1.需求 2.流程分析 3.实现过程 4.总结 1.需求 在我们正在开发的项目&#xff0c;有这样一种需求&#xff0c;实现固定格式和自由格式的比特流无线传输。解释一下&#xff0c;固定格式形如下面表格&#xff1a; 每个字段都有位宽、类型等属性&#xff0c;这种固定格式一…

期望最大化算法:机器学习中的隐变量与参数估计的艺术

引言 在机器学习和统计学领域&#xff0c;许多实际问题涉及到含有隐变量的概率模型。例如&#xff0c;在图像识别中&#xff0c;图像的语义信息往往是隐变量&#xff0c;而我们能观测到的只是图像的像素值&#xff1b;在语音识别中&#xff0c;语音对应的文本内容是隐变量&…

2025封禁指定国家ip-安装xtables-addons记录

如何安装和使用 安装lux仓库(该仓库包含xtables-addons所需的依赖环境) # wget http://repo.iotti.biz/CentOS/7/noarch/lux-release-7-1.noarch.rpm # rpm -ivh lux-release-7-1.noarch.rpm 安装xtables-addons。注意&#xff1a;必须先安装kmod-xtables-addons&#xff0c;再…

使用C语言实现栈的插入、删除和排序操作

栈是一种后进先出(LIFO, Last In First Out)的数据结构,这意味着最后插入的元素最先被删除。在C语言中,我们可以通过数组或链表来实现栈。本文将使用数组来实现一个简单的栈,并提供插入(push)、删除(pop)以及排序(这里采用一种简单的排序方法,例如冒泡排序)的操作示…

【Go】Go Gin框架初识(一)

1. 什么是Gin框架 Gin框架&#xff1a;是一个由 Golang 语言开发的 web 框架&#xff0c;能够极大提高开发 web 应用的效率&#xff01; 1.1 什么是web框架 web框架体系图&#xff08;前后端不分离&#xff09;如下图所示&#xff1a; 从上图中我们可以发现一个Web框架最重要…

【深度学习】Windows系统Anaconda + CUDA + cuDNN + Pytorch环境配置

在做深度学习内容之前&#xff0c;为GPU配置anaconda CUDA cuDNN pytorch环境&#xff0c;在网络上参考了很多帖子&#xff0c;但pytorch的安装部分都有些问题或者比较复杂繁琐&#xff0c;这里总结了相对简单快速的配置方式 文章目录 AnacondaCUDAcuDNNpytorchtorchtorchau…

提供的 IP 地址 10.0.0.5 和子网掩码位 /26 来计算相关的网络信息

网络和IP地址计算器 https://www.sojson.com/convert/subnetmask.html提供的 IP 地址 10.0.0.5 和子网掩码位 /26 来计算相关的网络信息。 子网掩码转换 子网掩码 /26 的含义二进制表示:/26 表示前 26 位是网络部分&#xff0c;剩下的 6 位是主机部分。对应的子网掩码为 255…

js中的Object.defineProperty()详解

文章目录 一、Object.defineProperty()二、descriptor属性描述符2.1、数据描述符2.2、访问器描述符2.3、descriptor属性2.3.1、value2.3.2、writable2.3.3、enumerable &#xff08;可遍历性&#xff09;2.3.4、configurable &#xff08;可配置性&#xff09; 三、注意事项 一…

单细胞组学大模型(8)--- scGenePT,scGPT和GenePT的结合,实验数据和文本数据的交融模型

–https://doi.org/10.1101/2024.10.23.619972 研究团队和单位 Theofanis Karaletsos–Head Of AI - Science at Chan Zuckerberg Initiative &#xff08;Chan Zuckerberg Initiative是扎克伯格和他妻子Chan成立的科研&教育机构&#xff09; 研究简介 研究背景&…

微信原生小程序自定义封装组件(以导航navbar为例)

封装 topnav.js const App getApp(); Component({// 组件的属性列表properties: {pageName: String, //中间的titleshowNav: { //判断是否显示左上角的按钮 type: Boolean,value: true},showHome: { //判断是否显示左上角的home按钮type: Boolean,value: true},showLocat…

day06_Spark SQL

文章目录 day06_Spark SQL课程笔记一、今日课程内容二、DataFrame详解&#xff08;掌握&#xff09;5.清洗相关的API6.Spark SQL的Shuffle分区设置7.数据写出操作写出到文件写出到数据库 三、Spark SQL的综合案例&#xff08;掌握&#xff09;1、常见DSL代码整理2、电影分析案例…

HarmonyOS NEXT应用开发边学边玩,从零实现一影视APP(四、最近上映电影滚动展示及加载更多的实现)

在HarmonyOS NEXT开发环境中&#xff0c;我们可以使用多种组件和库来构建丰富且交互友好的应用。本文将展示如何使用HarmonyOS NEXT框架和nutpi/axios库&#xff0c;从零开始实现一个简单的影视APP的首页&#xff0c;主要关注最近上映电影的滚动展示及加载更多功能的实现。 安装…

快速、可靠且高性价比的定制IP模式提升芯片设计公司竞争力

作者&#xff1a;Karthik Gopal&#xff0c;SmartDV Technologies亚洲区总经理 智权半导体科技&#xff08;厦门&#xff09;有限公司总经理 无论是在出货量巨大的消费电子市场&#xff0c;还是针对特定应用的细分芯片市场&#xff0c;差异化芯片设计带来的定制化需求也在芯片…