概述:
我们在函数中,有时候会需要返回多个数据,一般有以下几种方式。
方式一: 使用结构体 (推荐使用)
struct ReturnData {
std::string name;
int age;
};
ReturnData func1() {
std::string retName = "张三";
int retAge = 18;
return ReturnData{retName,retAge};
}
ReturnData data = func();
如上,我们使用结构体返回了两个不同类型的数据, 当然返回多个数据(相同类型或者不同类型)当然也是可以的。
而且使用结构体返回的多个数据,我们能够很直观的区分这多个数据分别代表着什么。比如: name中的数据,那自然表示的是名字。
age中的数据,自然表示的是年龄。
方式二: 使用返回参数
void func1(std::string& outName, int& outAge) {
std::string retName = "张三";
int retAge = 18;
outName = retName;
outAge = retAge;
}
std::string Name;
int Age;
func1(Name,Age);
返回参数就是通过引用或者指针的方式将变量传入,然后在函数内部将返回的数据放入到参数中,然后带出函数。
我们在外部让Name和Age作为参数传入函数内部,函数内部将要返回的值写入到其内部,这样就实现了将数据返回。 在外部就可以访问到数据。
当然参数使用指针也可以实现。
使用这种方式,返回的数据不能太多。
方式三: 使用数组
int* func1() {
int age = 10;
int score = 100;
return new int[2]{age, score};
}
int *arr = func1();
我们上述返回的是一个int类型的数组,内部存放了我们的要返回的数据。
外部我们使用相同类型的指针接收,然后遍历得到结果。但是这里会有一个问题,我们无法知道数组的长度,所以这对于遍历而言是一件麻烦事
而且,这种方式只能返回同类型的数据。
替换: 使用vector动态数组或者array数组
上面返回的时候,我们接收返回值并不知道其长度到底是多少,所以我们可以使用c++标准库中的数组来替换。
使用vector
#include <vector>
std::vector<int> func1() {
int age = 10;
int score = 100;
std::vector<int> v1;
v1.emplace_back(age);
v1.emplace_back(score);
return v1;
}
std::vector<int> v1 = func1; // 或者使用auto
使用array
#include <array>
std::array<int,2> func1() {
int age = 10;
int score = 100;
return std::array<int, 2> { age,score };
}
auto a1 = func1();
这两种方式,我们就可以在外部回去到其长度,只需要调用size()函数就行。
但是,相较于结构体的方式,使用数组返回的数据是不明确的,我们在外部只能得到数据,但是无法清晰的知道存储在0位置的和1位置的数据到底代表了什么。
方式四: 使用pair或者元组
使用tuple
#include <tuple>
std::tuple<int,std::string> func1() {
std::string name = "张三";
int age = 10;
std::tuple<int, std::string> t1 = std::make_tuple(age, name);
return t1;
}
auto t1 = func1();
std::cout << "第一个元素:" << std::get<0>(t1) << std::endl;
std::cout << "第二个元素:" << std::get<1>(t1) << std::endl;
使用pair
#include <utility>
std::pair<int,std::string> func1() {
std::string name = "张三";
int age = 10;
auto p1 = std::make_pair<int, std::string>(std::move(age),std::move(name));
return p1;
}
auto p1 = func1();
std::cout << "第一个元素:" << p1.first << std::endl;
std::cout << "第二个元素:" << p1.second << std::endl;
使用tuple和pair,都可以很好的返回数据,tuple可以返回多个数据。
但是,它们和数组一样,都无法直观地看出具体返回数据代表的含义。