C++ 函数返回多个值的方法总结

思路

一、返回可以存储多个值的数据结构

C++的函数返回值没有python那样容易,不能直接返回多个值,原则上C++函数最多只能返回一个数据。那么我们就应该考虑:

要想返回多个值,可以使得返回值是一个可以存储多个值的数据结构。

那么什么数据结构可以存储多个值呢?那就太多了,主要可以分为两类:

(1)基本数据结构:数组、容器(如vector)、关联容器(map、set)、pair、tuple 等
(2)自定义数据结构:类、结构体等

所以以上数据结构都可以作为函数返回值,从而实现函数返回多个值的目的。但是我们要考虑这些数据结构是否都适用于做返回值:

(1)数组和容器可以用于返回多个数据类型相同的值,具体实现可以参考 C++ 函数返回二维数组和二维vector容器 vector<vector<int>> 在STL容器中,vector的优良性质最适合作为返回值使用。

(2)关联容器map(以及pair)因为key-value的牵连关系,其实返回的是一个值,并不适用于返回多个值。并且map无法返回奇数个值(如3个值)。

(3)关联容器set作为返回值与数组和容器功能冲突,显然后面二者更适合作为返回值使用。

(4)tuple可以存储多个数据类型不同的元素,非常适用于返回多个值。示例:

#include <iostream>
#include <tuple>     //使用tuple要包含头文件
#include <string>    //使用string要包含头文件,否则无法直接用cout输出string对象。

using namespace std;


tuple<int,string> func()
{
    
    
	tuple<int, string> result = make_tuple(2, "hello");
	return result;
}

int main()
{
    
    
	tuple<int, string> para = func();
	cout << get<0>(para) << endl;     //2
	cout << get<1>(para) << endl;     //hello
	return 0;
}

但由于tuple类型定义比较复杂,比如上面的 tuple<int, string> ,一旦需要添加或更改返回值,那么也需要修改tuple的类型,这样就很麻烦了。这一点没有结构体好用,结构体只需要添加或更改数据成员即可,类型不需要修改。

(5)类和结构体可以将多个返回值作为成员,因此也可以作为返回值。但返回值一定是共有的,所以只需要使用struct即可,没必要使用class,所以struct比class更适合。示例:

#include <iostream>
#include <string>     //使用string要包含头文件
using namespace std;


struct returnValue
{
    
    
	double x;
	string s;
	//定义构造函数方便初始化,否则无法通过构造函数初始化。
	returnValue() = default;
	returnValue(double x_, string s_) :x(x_), s(s_) {
    
    }    
};

returnValue func()
{
    
    
	returnValue output(2,"hello");
	return output;
}

int main()
{
    
    
	returnValue result = func();
	cout << result.x << endl;    //2
	cout << result.s << endl;    //hello
	return 0;
}

总结来看,适合作为返回值的数据类型有:

数组、vector容器、tuple、结构体

具体使用哪个根据实际情况而定。

二、使用引用形参返回额外信息

那只能使用1.1中的数据结构才能实现返回多个值的目的吗?别忘了,使用引用传参也可以改变参数的值,那么只要将想要获得的值作为被引用传值的实参,这样就可以获得额外信息。

具体参考:C++ 使用引用形参返回额外信息

猜你喜欢

转载自blog.csdn.net/qq_43799400/article/details/126197617