
问题背景:当我们有一个函数,在C++默认情况下,我们不能返回两种类型。
然而在python中,我们可以返回两种类型。
当我们可能会返回一个整数或一个字符串,我们肯定不能同时返回两者 ;如果一个函数需要返回两个或多个相同类型的变量,则可以返回vector或数组。
但是我们如何返回不同类型的变量?
1、先创建变量,然后用传引用(指针)间接修改变量
#include
#include
void foo(std::string& string1, std::string& string2)
{
string1 = "qiu";
string2 = "yong";
}
int main()
{
std:string string1, string2;
foo();
std::string string3 = string1 + string2;
std::cout << string3 << std::endl;
return 0;
}
这是最理想的方法之一,因为没有字符串复制,虽然我们重新分配了字符串,但是在性能方面这是很好的。
用这种方案,如果传递引用,需要传递一个有效的变量;而用一个指针,可以传递null之类的,然后做一个检查,判断指针是否为空。
2、使用数组(std::array)/ 使用std::vector (两者只在类型相同时有效)
#include
#include
#include
std::array<std::string, 2> foo()
{
std::string string1 = "qiu";
std::string string2 = "yong";
std::array<std::string, 2> results;
results[0] = string1;
results[1] = string2;
return results;
}
int main()
{
auto string3 = foo();
for (const auto& s : string3)
std::cout << s << " ";
return 0;
}
使用std::vector:
#include
#include
#include
std::vector<std::string> foo()
{
std::string string1 = "qiu";
std::string string2 = "yong";
std::vector<std::string> results;
results[0] = string1;
results[1] = string2;
return results;
}
int main()
{
auto string3 = foo();
for (const auto& s : string3)
std::cout << s << " ";
return 0;
}
array与vector相比,array会在栈上创建,而vector会把它的底层存储在堆上,所以从技术上讲,返回std::array会更快。
3、使用tuple(元组)
std::tuple:定义于头文件< tuple >,是固定大小的异类值汇集,也是std::pair的推广。
它可以包含x个变量,但它不关心类型。
#include
#include
#include
std::tuple<std::string, std::string> foo()
{
std::string string1 = "qiu";
std::string string2 = "yong";
return std::make_pair(string1, string2); //返回tuple元组中
}
int main()
{
std::tuple<std::string, std::string> sources = foo();
std::string f = std::get<0>(sources);
std::string s = std::get<1>(sources); //从tuple中取出元素
std::cout << f << s << std::endl;
return 0;
}
当只用返回两个变量时,可以使用std::pair,因为相对于std::tuple,其具有较好的可读性。
4、使用结构体
#include
#include
struct ShaderProgramSource
{
std::string string1;
std::string string2;
};
struct ShaderProgramSource foo()
{
struct ShaderProgramSource example;
example.string1 = "qiu";
example.string2 = "yong";
return example;
}
int main()
{
struct ShaderProgramSource instance = foo();
std::cout << instance.string1 << intstance.string2 << std::endl;
return 0;
}
相较于std::pair,使用struct不仅具有较好的可读性,而且建立与栈上,运行效率较高。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)