Skip to the content.

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;
}

这都是些啥啊,好奇怪啊。。。

最实用的还是返回结构体和传递引用…


https://www.bilibili.com/video/BV1By4y1n7NA