• C++ 函数返回多个值的方法总结


    思路

    一、返回可以存储多个值的数据结构

    C++的函数返回值没有python那样容易,不能直接返回多个值,原则上C++函数最多只能返回一个数据。那么我们就应该考虑:

    要想返回多个值,可以使得返回值是一个可以存储多个值的数据结构。

    那么什么数据结构可以存储多个值呢?那就太多了,主要可以分为两类:

    (1)基本数据结构:数组、容器(如vector)、关联容器(map、set)、pair、tuple 等
    (2)自定义数据结构:类、结构体等
    
    • 1
    • 2

    所以以上数据结构都可以作为函数返回值,从而实现函数返回多个值的目的。但是我们要考虑这些数据结构是否都适用于做返回值:

    (1)数组和容器可以用于返回多个数据类型相同的值,具体实现可以参考 C++ 函数返回二维数组和二维vector容器 vector<vector<int>> 在STL容器中,vector的优良性质最适合作为返回值使用。

    (2)关联容器map(以及pair)因为key-value的牵连关系,其实返回的是一个值,并不适用于返回多个值。并且map无法返回奇数个值(如3个值)。

    (3)关联容器set作为返回值与数组和容器功能冲突,显然后面二者更适合作为返回值使用。

    (4)tuple可以存储多个数据类型不同的元素,非常适用于返回多个值。示例:

    #include 
    #include      //使用tuple要包含头文件
    #include     //使用string要包含头文件,否则无法直接用cout输出string对象。
    
    using namespace std;
    
    
    tuple<int,string> func()
    {
    	tuple<int, string> result = make_tuple(2, "hello");
    	return result;
    }
    
    int main()
    {
    	tuple<int, string> para = func();
    	cout << get<0>(para) << endl;     //2
    	cout << get<1>(para) << endl;     //hello
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    但由于tuple类型定义比较复杂,比如上面的 tuple ,一旦需要添加或更改返回值,那么也需要修改tuple的类型,这样就很麻烦了。这一点没有结构体好用,结构体只需要添加或更改数据成员即可,类型不需要修改。

    (5)类和结构体可以将多个返回值作为成员,因此也可以作为返回值。但返回值一定是共有的,所以只需要使用struct即可,没必要使用class,所以struct比class更适合。示例:

    #include 
    #include      //使用string要包含头文件
    using namespace std;
    
    
    struct returnValue
    {
    	double x;
    	string s;
    	//定义构造函数方便初始化,否则无法通过构造函数初始化。
    	returnValue() = default;
    	returnValue(double x_, string s_) :x(x_), s(s_) {}    
    };
    
    returnValue func()
    {
    	returnValue output(2,"hello");
    	return output;
    }
    
    int main()
    {
    	returnValue result = func();
    	cout << result.x << endl;    //2
    	cout << result.s << endl;    //hello
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    总结来看,适合作为返回值的数据类型有:

    数组、vector容器、tuple、结构体

    具体使用哪个根据实际情况而定。

    二、使用引用形参返回额外信息

    那只能使用1.1中的数据结构才能实现返回多个值的目的吗?别忘了,使用引用传参也可以改变参数的值,那么只要将想要获得的值作为被引用传值的实参,这样就可以获得额外信息。

    具体参考:C++ 使用引用形参返回额外信息

  • 相关阅读:
    java基于ssm+vue+elementui的勤工助俭学管理系统
    判断两个DataFrame和array的列(Series)是否相同
    【PyTorch】如何取得预训练模型的标签label列表(以 Alexnet 在 ImageNet 上的预训练模型为例)
    03 光栅图形学算法-- 裁剪算法
    EFDC模型教程
    SUSE 发布 NeuVector 5.0,从数据中心、云端到边缘全面拓展云原生安全能力
    Sass详解和应用
    27:尽量少做转型动作
    elasticsearch 1.5 + mysql安装配置与简单使用
    (附源码)ssm高校选课系统 毕业设计 291627
  • 原文地址:https://blog.csdn.net/qq_43799400/article/details/126197617