c++, 函数返回多个数据(相同类型或者不同类型)

概述: 

我们在函数中,有时候会需要返回多个数据,一般有以下几种方式。

方式一:  使用结构体 (推荐使用)

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可以返回多个数据。

但是,它们和数组一样,都无法直观地看出具体返回数据代表的含义。 

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值