052-如何处理多返回值
为了在c++中返回多个返回值,我们可以封装自己的类型,在Java中我们也经常用到,像这样
#include <iostream>
#include <string>
struct Result {
std::string result1;
std::string result2;
};
Result test() {
return {"aaa", "bbb"};
}
int main() {
const Result &result = test();
std::cout << result.result1 << std::endl;
std::cout << result.result2 << std::endl;
return 0;
}
但是,我们在c++中有另一种方式,像这样
#include <iostream>
#include <string>
void test(std::string &outResult1, std::string &outResult2) {
outResult1 = "aaa";
outResult2 = "bbb";
}
int main() {
std::string result1;
std::string result2;
test(result1, result2);
std::cout << result1 << std::endl;
std::cout << result2 << std::endl;
return 0;
}
我们可以将需要接收结果的引用传递过去,在调用的函数中直接赋值,当然,我们还可以直接传递指针,传递指针的好处是,如果我们这个值不想要结果,可以不给他赋值,像下面这样
#include <iostream>
#include <string>
void test(std::string *outResult1, std::string *outResult2) {
if (outResult1) {
*outResult1 = "aaa";
}
if (outResult2) {
*outResult2 = "bbb";
}
}
int main() {
std::string result1;
std::string result2;
test(&result1, nullptr);
std::cout << result1 << std::endl;
return 0;
}
当然,我们还可以返回数组
#include <iostream>
#include <string>
std::string *test() {
return new std::string[]{"aaa", "bbb"};
}
int main() {
std::string result1;
std::string result2;
std::string *pString = test();
result1 = pString[0];
result2 = pString[1];
std::cout << result1 << std::endl;
std::cout << result2 << std::endl;
//记得把这玩意删掉
delete[] pString;
return 0;
}
或者创建std::array
#include <iostream>
#include <string>
#include <array>
std::array<std::string, 2> test() {
// return std::array<std::string, 2>{"aaa", "bbb"};
return {"aaa", "bbb"};
}
int main() {
std::string result1;
std::string result2;
const std::array<std::string, 2> &array = test();
result1 = array[0];
result2 = array[1];
std::cout << result1 << std::endl;
std::cout << result2 << std::endl;
return 0;
}
或者使用vector
#include <iostream>
#include <string>
#include <vector>
std::vector<std::string> test() {
// return std::vector<std::string>{"aaa", "bbb"};
return {"aaa", "bbb"};
}
int main() {
std::string result1;
std::string result2;
const std::vector<std::string> &vector = test();
result1 = vector.at(0);
result2 = vector.at(1);
std::cout << result1 << std::endl;
std::cout << result2 << std::endl;
return 0;
}
array与vector的区别是,array是在栈上创建元素,而vector是在堆上创建元素,理论上array会更快
还可以使用tuple
#include <iostream>
#include <string>
#include <functional>
std::tuple<std::string, std::string> test() {
return std::make_pair("aaa", "bbb");
}
int main() {
std::string result1;
std::string result2;
const std::tuple<std::string, std::string> &tuple = test();
result1 = std::get<0>(tuple);
result2 = std::get<1>(tuple);
std::cout << result1 << std::endl;
std::cout << result2 << std::endl;
return 0;
}
还可以使用pair
#include <iostream>
#include <string>
#include <functional>
std::pair<std::string, std::string> test() {
return std::make_pair("aaa", "bbb");
}
int main() {
std::string result1;
std::string result2;
const std::pair<std::string, std::string> &pair = test();
result1 = pair.first;
result2 = pair.second;
std::cout << result1 << std::endl;
std::cout << result2 << std::endl;
return 0;
}
这都是些啥啊,好奇怪啊。。。
最实用的还是返回结构体和传递引用…