Cherno C++学习笔记 P52 处理多返回值
在这篇文章当中,我们解决一下如何用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确实是更好的方法。
相关文章:
Cherno C++学习笔记 P52 处理多返回值
在这篇文章当中,我们解决一下如何用C的函数处理多返回值的问题。 在有些情况下,我们希望我们的函数可以返回多个返回值,比如返回两个string或者是一个int加上一个string。如果我们用的是python之类的语言的话,那这个事情其实是很…...
Android车机DIY开发之学习篇(一)编译UBOOT以正点原子为例
Android车机DIY开发之学习篇(一)编译UBOOT以正点原子为例 1.代码在u-boot文件夹下 2.在 U-Boot 源码目录下执行如下命令编译 U-Boot: ./make.sh rk3588生成两个文件 ### uboot.img 对应<SDK>/uboot/uboot.img ### rk3588_spl_loader_v1.13.113.bin 对应<…...
扩散模型、原型网络以及肿瘤微环境解析等名词出现在基金立项名单中,它们各自的应用现状如何?|文献速递·25-01-10
小罗碎碎念 昨晚看到了云南省2025年自然科学基金立项的名单,今天把医工交叉的项目挑出来和大家分享一下。 今天分享的文献,灵感来源于2025年的基金,我会先简单分析一下基金的情况,然后再和大家分享三篇与立项基金相关的文献。 总共…...
【Java设计模式-4】策略模式,消灭if/else迷宫的利器
各位Java编程小伙伴们!今天咱们要一起探索一个超级厉害的Java设计模式——策略模式,它就像是一把神奇的魔法剑,专门用来斩断那些让我们代码变得乱糟糟的if/else语句迷宫! 一、if/else的烦恼 在编程的奇妙世界里,我们…...
10分钟快速了解OceanGPT(沧渊)
10分钟快速了解OceanGPT(沧渊) 海洋科学任务的大语言模型——OceanGPT OceanGPT是如何训练的?为了训练 OceanGPT (沧渊) ,收集了一个跨越多个领域的海洋科学语料库。由于每个子领域和主题都有其独特的数据特征和模式,因此提出了一个特定于领域的指令生成框架,称为 DoDirec…...
学习及笔记
1、计算md5 md5sum 文件名 2、跨服务器复制 scp 文件 目标用户名目标Ip:目标路径 3、curl curl -X POST http://10.105.2.46/getUerls -H "Content-Type: application/json" -d {"id": 379, "userId": "lyc", "password":…...
TensorFlow Quantum快速编程(基本篇)
一、TensorFlow Quantum 概述 1.1 简介 TensorFlow Quantum(TFQ)是由 Google 开发的一款具有开创性意义的开源库,它宛如一座桥梁,巧妙地将量子计算与 TensorFlow 强大的机器学习功能紧密融合。在当今科技飞速发展的时代,传统机器学习虽已取得诸多瞩目成就,然而面对日益…...
Vue.js组件开发-实现图片裁剪
在Vue.js中开发一个图片裁剪组件,可以使用cropperjs库,它是一个功能强大的JavaScript库,专门用于图片裁剪。在Vue项目中,可以通过vue-cropperjs这个Vue包装器来更方便地使用cropperjs。 步骤: 1. 安装依赖 首先&…...
Jira用例自动去除summary重复用例
title: Jira用例自动去除summary重复用例 tags: - jira - python categories: - python一、背景与需求二、解决方案思路三、实施步骤本文永久更新地址: 在使用 Jira 进行项目管理时,测试用例的维护至关重要。随着项目推进,用例数量增多,可能…...
2024年开发语言热度排名
随着技术的不断发展和变化,编程语言的热度也在不断演变。2024年即将到来,我们有必要回顾和展望当前和未来的开发语言市场。本文将基于多个因素,包括行业需求、社区支持、流行度以及新兴趋势,对2024年的开发语言热度进行排名和分析…...
【ArcGIS初学】产生随机点计算混淆矩阵
混淆矩阵:用于比较分类结果和地表真实信息 总体精度(overall accuracy) :指对角线上所有样本的像元数(正确分类的像元数)除以所有像元数。 生产者精度(producers accuracy) :某类中正确分类的像元数除以参考数据中该类的像元数(列方向),又称…...
OpenScholar助高效检索和整合科学文献?
从事科研的人都离不开读文献。然而,如今每年发表的论文数量已达数百万篇(例如,某位大佬在硕博期间就发表了178篇~)。在如此海量的文献中,如何高效利用宝贵的时间获取所需信息,显得尤为重要。 近…...
代码随想录Day34 | 62.不同路径,63.不同路径II,343.整数拆分,96.不同的二叉搜索树
代码随想录Day34 | 62.不同路径,63.不同路径II,343.整数拆分,96.不同的二叉搜索树 62.不同路径 动态规划第二集: 比较标准简单的一道动态规划,状态转移方程容易想到 难点在于空间复杂度的优化,详见代码 class Solution {public int uniq…...
非PHP开源内容管理系统(CMS)一览
在现代网站开发中,内容管理系统(CMS)是不可或缺的工具。虽然许多广泛使用的CMS(如WordPress和Joomla)是基于PHP开发的,但其他编程语言同样诞生了许多优秀的开源CMS,适用于不同需求和技术栈的项目…...
【Rust】常见集合
目录 思维导图 一、Rust常用集合 1. Rust标准库中的集合概述 2. 常用集合类型 2.1 向量(Vector) 2.2 字符串(String) 2.3 哈希映射(Hash Map) 二、向量(Vec) 1. 向量的概述…...
55. 跳跃游戏
题目 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 C #include <…...
关于 ThinkPHP 与 PostgreSQL 结合使用的一些要点
ThinkPHP 是一款流行的 PHP 开发框架,而 PostgreSQL 是功能强大的开源关系型数据库。它们可以结合使用来开发各类应用,以下是关于 ThinkPHP 与 PostgreSQL 结合使用的一些要点: 配置数据库连接 编辑配置文件:在 ThinkPHP 项目中&…...
【 PID 算法 】PID 算法基础
一、简介 PID即:Proportional(比例)、Integral(积分)、Differential(微分)的缩写。也就是说,PID算法是结合这三种环节在一起的。粘一下百度百科中的东西吧。 顾名思义,…...
介绍下不同语言的异常处理机制
Golang 在Go语言中,有两种用于处于异常的机制,分别是error和panic; panic panic 是 Go 中处理异常情况的机制,用于表示程序遇到了无法恢复的错误,需要终止执行。 使用场景 程序出现严重的不符合预期的问题&#x…...
Sprint Boot教程之五十八:动态启动/停止 Kafka 监听器
Spring Boot – 动态启动/停止 Kafka 监听器 当 Spring Boot 应用程序启动时,Kafka Listener 的默认行为是开始监听某个主题。但是,有些情况下我们不想在应用程序启动后立即启动它。 要动态启动或停止 Kafka Listener,我们需要三种主要方法…...
Linux服务器网络丢包场景及解决办法
一、Linux网络丢包概述 在数字化浪潮席卷的当下,网络已然成为我们生活、工作与娱乐不可或缺的基础设施,如同空气般,无孔不入地渗透到各个角落。对于 Linux 系统的用户而言,网络丢包问题却宛如挥之不去的 “噩梦”,频繁…...
2025年01月13日Github流行趋势
1. 项目名称:Jobs_Applier_AI_Agent 项目地址url:https://github.com/feder-cr/Jobs_Applier_AI_Agent项目语言:Python历史star数:25929今日star数:401项目维护者:surapuramakhil, feder-cr, cjbbb, sarob…...
贪心算法详细讲解(沉淀中)
文章目录 1. 什么是贪心算法?(贪婪鼠目寸光)经典例题1.1.1 找零问题1.1.2最小路径和1.1.3 背包问题 2.贪心算法的特点2.1 证明例1 3.学习贪心的方向心得体会 1. 什么是贪心算法?(贪婪鼠目寸光) 贪心策略&a…...
C/C++ 数据结构与算法【排序】 常见7大排序详细解析【日常学习,考研必备】带图+详细代码
常见7种排序算法 冒泡排序(Bubble Sort)选择排序(Selection Sort)插入排序(Insertion Sort)希尔排序(Shell Sort)归并排序(Merge Sort)快速排序(…...
Oracle Dataguard(主库为双节点集群)配置详解(4):配置备库
Oracle Dataguard(主库为双节点集群)配置详解(4):配置备库 目录 Oracle Dataguard(主库为双节点集群)配置详解(4):配置备库一、为备库配置静态监听1、配置 li…...
【Unity3D日常开发】Unity3D中打开Window文件对话框打开文件(PC版)
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群:398291828小红书小破站 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 这篇文章继续讲如何使用Unity3D打开Window文…...
STM32-RTC实时时钟
1.0 RTC简介 RTC(Real Time Clock)实时时钟 RTC是一个独立的定时器,可为系统提供时钟和日历的功能 RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0~3.6V)断电后可借助VBAT&#x…...
QT跨平台应用程序开发框架(1)—— 环境搭建
目录 一,关于QT 二,关于应用程序框架 三,环境搭建 3.1 预备 3.2 下载Qt SDK 3.3 安装Qt SDK 3.4 配置环境变量 3.5 认识一些重要工具 四,Qt Creator 的基本使用 4.1 创建项目 4.2 代码解释 一,关于QT 互联网…...
HTB:Paper[WriteUP]
目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 对靶机进行子域…...
【数据可视化-12】数据分析岗位招聘分析
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
UE材质节点Fresnel
Fresnel节点 ExponentIn 控制边缘透明度 BaseReflectFractionIn 控制中心透明度...
宁德时代C++后端开发面试题及参考答案
请阐述面向对象的三大特性。 面向对象编程有三大特性,分别是封装、继承和多态。 封装是指将数据和操作数据的方法绑定在一起,对数据的访问和操作进行限制。这样做的好处是可以隐藏对象的内部细节,只暴露必要的接口给外部。例如,我们可以把一个汽车类的内部引擎状态、速度等…...
opencv warpAffine仿射变换C++源码分析
基于opencv 3.1.0源代码 sources\modules\imgproc\src\imgwarp.cpp void cv::warpAffine( InputArray _src, OutputArray _dst,InputArray _M0, Size dsize,int flags, int borderType, const Scalar& borderValue ) {...if( !(flags & WARP_INVERSE_MAP) ){//变换矩阵…...
六十九:基于openssl实战验证RSA
RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,广泛应用于数据加密和数字签名领域。在实际开发和学习过程中,理解 RSA 的工作原理和使用场景非常重要。本文将以 OpenSSL 工具为基础,通过实例操作来验证和理解 RSA 的…...
Docker的CMD指令
CMD指令是Dockerfile中的一个重要指令,用于指定容器启动时执行的默认命令。CMD为容器运行时提供了一个默认的执行指令,可以在容器启动时自动运行该命令。 * CMD指令用于指定容器启动时的默认命令 CMD指令指定的命令通常是容器启动后要执行的主要进程。…...
redis缓存篇知识点总结
1.缓存雪崩 当大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,从而导致数据库的压力骤增,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃 发生缓存雪崩有两…...
onlyoffice编辑服务部署
下载官方镜像 下载onlyoffice_7.4.1.tar.gz镜像包 安装官方镜像 上传镜像包后执行 docker load -i onlyoffice_7.4.1.tar.gz 将镜像部署到本地仓库 下载onlyoffice编辑服务包 下载onlyoffice.zip包 启动onlyoffice编辑服务 上传包至服务器,解压包,…...
RPC实现原理,怎么跟调用本地一样
回答1 要让⽹络通信细节对使⽤者透明,我们需要对通信细节进⾏封装,我们先看下⼀个 RPC 调⽤的流程涉及到哪些通 信细节: 1. 服务消费⽅( client )调⽤以本地调⽤⽅式调⽤服务; 2. client stub 接收到调…...
JDK下载安装配置
一.JDK安装配置。 1.安装注意路径,其他直接下一步。 2.配置。 下接第4步. 或者 代码复制: JAVA_HOME D:\Program Files\Java\jdk1.8.0_91 %JAVA_HOME%\bin 或者直接配置 D:\Program Files\Java\jdk1.8.0_91\bin 3.验证(CMD)。 java javac java -version javac -version 二.下…...
C++(3)
1.顺序表封装 #include <iostream>using namespace std;//类型重命名 using datatype int;//定义一个顺序表类 class SeqList { private:datatype *data;//指向堆区空间的指针int size 0;//数组大小int len 0;//顺序表实际长度public://无参构造SeqList():data(new d…...
工具学习_Conan_Install
1. 依赖关系获取 为了获取TPL间的依赖关系,我们首先从 GitHub 项目中提取 Conan 包含的组件,如下所示: 在获取组件名之后,我们根据组件名从 Conan 中获取 TPL 间的依赖关系,如下图所示: 之后获得包含TPL间…...
忘记了PDF文件的密码,怎么办?
PDF文件可以加密,大家都不陌生,并且大家应该也都知道PDF文件有两种密码,一个打开密码、一个限制编辑密码,因为PDF文件设置了密码,那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密? PDF和offi…...
HTML实战课堂之启动动画弹窗
一:代码片段讲解 小提示:下面是一个包含启动页和弹窗的完整示例。这个示例包括一个简单的启动页和一个弹窗,当用户点击启动页上的按钮时,会显示弹窗。 1. **HTML结构**: - #startPage:启动页,包…...
thinkphp 5.0 结合redis 做延迟队列,队列无法被消费
目录 一、Linux 环境下 二、如何验证消息队列被正确监听 一、Linux 环境下 项目部署在Linux 环境下,首先找到项目的部署路径,接着输入命令,这个命令是以守护进程方式进行监听你的队列,只要redis 不关闭 就可以一直监听这个队列 nohup php …...
open3d+opencv实现矩形框裁剪点云操作(C++)
👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… 💫签名:面朝大海,春暖花开! open3dopencv实现矩形框裁剪点云操作(Cÿ…...
Android RIL(Radio Interface Layer)全面概述和知识要点(3万字长文)
在Android面试时,懂得越多越深android framework的知识,越为自己加分。 目录 第一章:RIL 概述 1.1 RIL 的定义与作用 1.2 RIL 的发展历程 1.3 RIL 与 Android 系统的关系 第二章:RIL 的架构与工作原理 2.1 RIL 的架构组成 2.2 RIL 的工作原理 2.3 RIL 的接口与协议…...
mac安装java17
目录 1、确保 Homebrew 已安装。如果没有安装,运行以下命令2、安装 OpenJDK 173、安装完成后,运行以下命令设置环境变量4、检查一下 1、确保 Homebrew 已安装。如果没有安装,运行以下命令 /bin/bash -c "$(curl -fsSL https://raw.gith…...
npx和npm区别
npx 和 npm 是 Node.js 生态中的两个工具,它们有不同的用途和功能: 1. npm(Node Package Manager) 主要作用: 包管理工具: 用来安装、管理、卸载 Node.js 的包(module/library)。提…...
STM32 FreeRTOS 介绍
目录 什么是裸机开发 什么是操作系统 通用操作系统 实时操作系统 FreeRTOS简介 FreeRTOS发展历史 FreeRTOS优势 FreeRTOS特点 什么是裸机开发 裸机开发指的是在没有操作系统(OS)或者其他高级软件支持的情况下,直接在裸机硬件上进行软…...
C#面向对象(封装,继承,多态,抽象)--08
目录 一.类和对象 1.类(Class) 2.对象 二.继承 1.定义 2.实现方式 三.多态 1.定义 2.实现方式 3.代码示例 四.抽象 1.定义 2.实现方式 3.代码示例 总结 面向对象(OOP)是C#编程语言的核心概念之一.它通过类和对象的方式来组织代码,提供了更高的代码复用性,可拓展性…...