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
#include //使用tuple要包含头文件
#include //使用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
(5)类和结构体可以将多个返回值作为成员,因此也可以作为返回值。但返回值一定是共有的,所以只需要使用struct即可,没必要使用class,所以struct比class更适合。示例:
#include
#include //使用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++ 使用引用形参返回额外信息