std :: pair,std :: tuple从函数返回多个值

std :: pair

Pair是在标准库中找到的抽象数据结构,该结构绑定了两个异构成员。Pair是有序结构。

任何一对的标准语法是

pair<T1,T2> mypair

其中,T1T2是可以为默认值或用户定义的数据类型。两个T也可以相同或不同。

下面是一对的例子。

1)如何创建一对

使用带有两个参数的make_pair()函数。该对的第一个对象的第一个参数,第二个对象的第二个参数。

2)如何访问配对成员

.first = access to first member
.second = access to second member

示例

#include <bits/stdc++.h>
using namespace std;

int main(){
    //定义一个对
    pair<int, string> student;
    //创建对
    student = make_pair(1, "XYZ");

    //提取成员
    //.first提取第一个成员
    cout << "//滚动: " << student.first << endl; 
    //.second提取第二个成员
    cout << "//名称: " << student.second << endl; 

    //更新成员
    student.first = 2;
    student.second = "WQR";
    cout << "after updating...\n";
    //.first提取第一个成员
    cout << "//滚动: " << student.first << endl; 
    //.second提取第二个成员
    cout << "//名称: " << student.second << endl; 

    return 0;
}

输出:

//滚动: 1
//名称: XYZ
after updating...
//滚动: 2
//名称: WQR

现在,如果我们不使用一对,该怎么办?

是的,我们可以创建我们的课程,因为

class student {
    public:
        int roll;
        string name;
};

这将达到与两人完全相同的目的。

std :: tuple

就像对元组一样,另一个抽象数据结构可以将三个或更多异构数据成员绑定在一起。它也是有序的。

任何元组的标准语法是

tuple<T1,T2,..,Tn> mytuple

其中T i是可以是默认值或用户定义的任何数据类型。Ti也可以相同或不同

下面是一个元组的示例。

1)如何创建一个元组:

使用make_tuple()函数,该函数根据元组需要n个参数。第一个参数引用第一个对象,第二个参数引用第二个对象,依此类推。

2)如何访问元组成员:

为此,我们使用tie()函数对元组进行解包。下面是在C ++中使用元组的示例。

#include <bits/stdc++.h>
using namespace std;

int main(){
    //define a tuple of <roll,marks,name>
    tuple<int, int, string> student;
    //创建对
    student = make_tuple(1, 80, "XYZ");

    //提取成员
    int roll, marks;
    string name;

    //成员打开包装
    tie(roll, marks, name) = student; 
    cout << "//滚动: " << roll << endl;
    cout << "//标记: " << marks << endl;
    cout << "//名称: " << name << endl;

    return 0;
}

输出:

//滚动: 1
//标记: 80
//名称: XYZ

使用元组和对从函数返回多个值

在很多情况下,我们需要从函数返回多个值。但是对于默认数据类型,我们无法实现。因此,我们可以根据需求创建一个对或元组。

举例来说,

我们正在计算某人的百分比,并想检查他是否失败。如果他的分数低于40%,则他会失败。现在,我们可以使用一对<double,boolean>从函数中返回所有内容

INT将包含他的百分比和布尔将包含他是否失败与否。

下面是示例:

#include <bits/stdc++.h>
using namespace std;

pair<double, bool> calculat_grade(string name, int roll, int sub1, int sub2, int sub3, int sub4, int sub5)
{

    double aggre = (sub1 + sub2 + sub3 + sub4 + sub5) / 5.0;
    pair<double, bool> p;
    if (aggre < 40)
        p = make_pair(aggre, true); //失败
    else
        p = make_pair(aggre, false); //通过

    return p;
}

int main(){
    //输入学生详细信息
    string name;
    
    cout << "Enter student name\n";
    cin >> name;
    
    int roll;
    
    cout << "Enter student roll\n";
    cin >> roll;
    
    //输入学生的分数
    cout << "enter marks for five subjects\n";
    int sub1, sub2, sub3, sub4, sub5;
    
    cout << "Enter marks for subject1\n";
    cin >> sub1;
    cout << "Enter marks for subject2\n";
    cin >> sub2;
    cout << "Enter marks for subject3\n";
    cin >> sub3;
    cout << "Enter marks for subject4\n";
    cin >> sub4;
    cout << "Enter marks for subject5\n";
    cin >> sub5;

    pair<int, bool> result = calculat_grade(name, roll, sub1, sub2, sub3, sub4, sub5);

    if (result.second) {
        cout << "Student failed\n";
        cout << "aggregated //标记: " << result.first << endl;
    }
    else {
        cout << "Student passed\n";
        cout << "aggregated //标记: " << result.first << endl;
    }

    return 0;
}

输出:

Enter student name
Radib
Enter student roll
101
enter marks for five subjects
Enter marks for subject1
40
Enter marks for subject2
50
Enter marks for subject3
60
Enter marks for subject4
70
Enter marks for subject5
80
Student passed
aggregated //标记: 60

扩展以上程序,我们还可以从函数中返回学生姓名。

我们可以将对扩展为元组,下面是示例:

#include <bits/stdc++.h>
using namespace std;

tuple<string, double, bool> calculat_grade(string name, int roll, int sub1, int sub2, int sub3, int sub4, int sub5)
{
    double aggre = (sub1 + sub2 + sub3 + sub4 + sub5) / 5.0;
    tuple<string, double, bool> t;
    if (aggre < 40)
        t = make_tuple(name, aggre, true); //失败
    else
        t = make_tuple(name, aggre, false); //通过

    return t;
}

int main(){
    //输入学生详细信息
    string name;
 
    cout << "Enter student name\n";
    cin >> name;
 
    int roll;
 
    cout << "Enter student roll\n";
    cin >> roll;
 
    //输入学生的分数
    cout << "enter marks for five subjects\n";
    int sub1, sub2, sub3, sub4, sub5;
    cout << "Enter marks for subject1\n";
    cin >> sub1;
    cout << "Enter marks for subject2\n";
    cin >> sub2;
    cout << "Enter marks for subject3\n";
    cin >> sub3;
    cout << "Enter marks for subject4\n";
    cin >> sub4;
    cout << "Enter marks for subject5\n";
    cin >> sub5;

    string name_result;
    double aggre_result;
    bool failed;

    //打开元组的包装
    tie(name_result, aggre_result, failed) = calculat_grade(name, roll, sub1, sub2, sub3, sub4, sub5);

    if (failed) {
        cout << name_result << " failed\n";
        cout << "aggregated //标记: " << aggre_result << endl;
    }
    else {
        cout << name_result << " passed\n";
        cout << "aggregated //标记: " << aggre_result << endl;
    }

    return 0;
}

输出:

Enter student name
Radib
Enter student roll
102
enter marks for five subjects
Enter marks for subject1
34
Enter marks for subject2
47
Enter marks for subject3
29
Enter marks for subject4
52
Enter marks for subject5
18
Radib failed
aggregated //标记: 36

现在,您一定想知道为什么当我从主体传递相同的内容时,为什么要从函数返回名称。是的,这是多余的操作,只是为了使您了解我们如何从用户定义的函数返回多个事物。尽管这里我们主要采用输入,但是在某些应用程序中,可能会从文件中读取输入。在这种情况下,我们必须选择从函数返回多个值来执行上述操作。