C ++中的std :: equal()

equal()作为STL函数

语法:

bool equal(
    InputIterator1 first1, 
    InputIterator1 last1, 
    InputIterator2 first2);

哪里,

  • InputIterator1 first =迭代器,开始第一个序列范围

  • InputIterator1 last1 =迭代器到第一个序列范围的结尾

  • InputIterator2 first2 =迭代器开始第二个序列范围

返回类型: bool

  • True-如果两个范围内的所有元素都相同

  • False-如果两个范围内的所有元素都不相同

上面的语法用于使用标准==运算符比较元素。

我们还可以定义用户定义的二进制谓词(而不是'==')来检查是否相等。用户定义的二进制谓词的语法如下:

(二元谓词是一个带有两个参数并仅返回true或false的函数。)

bool equal(
    InputIterator1 first1, 
    InputIterator1 last1, 
    InputIterator2 first2, 
    BinaryPredicate pred);

使用上述语法,可以通过谓词检查相应范围的元素。

因此,我们发现第二个范围的最后一个迭代器没有共享,因为它只会比较范围1相同数量的元素。而且,它将顺序检查,这意味着[1、3、5]和[5] ,, 3,1]不一样。因此,两个范围的顺序必须相同。

1)使用默认的'=='/'!='运算符

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

int main(){
    vector<int> arr1{ 3, 2, 1, 4, 5, 6, 7 };

    vector<int> arr2{ 3, 2, 1, 4, 5 };

    if (equal(arr1.begin(), arr1.begin() + 5, arr2.begin())) {
        cout << "both ranges are exactly equal \n";
    }
    else
        cout << "both ranges are not exactly equal \n";

    vector<int> arr3{ 1, 2, 3, 4, 5, 6, 7 };

    vector<int> arr4{ 1, 2, 3, 4, 5 };

    if (equal(arr3.begin(), arr3.end(), arr4.begin())) {
        cout << "both ranges are exactly equal \n";
    }
    else
        cout << "both ranges are not exactly equal \n";

    return 0;
}

输出:

both ranges are exactly equal
both ranges are not exactly equal

在上面的程序中,我们检查了两种情况,并使用了默认的比较器。在第一种情况下,

第一个范围是arr1.begin()arr1.begin()+ 5,即arr1的仅前五个元素。第二个范围从arr2.begin()开始,它将仅从range2的开始检查前五个元素。由于两者相同,因此是匹配项。

[3,2,1,4,5]

在第二种情况下,由于我们使用了arr3的总范围,因此这是不匹配的。

2)使用用户定义的比较器功能

在这里,我们以一个用例为例,我们有两个向量用于学生详细信息,每个向量有五个学生。通过使用用户定义的预测,我们将检查两个列表是否相等。如果每个学生的详细信息都匹配,则两个列表都相等。要使学生详细信息匹配,所有详细信息(名次,姓名,分数)必须相同。

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

class student {

    int score;
    int roll;
    string name;

public:    student()
    {
        score = 0;
        roll = 0;
        name = "";
    }
    student(int sc, int ro, string nm)
    {
        score = sc;
        roll = ro;
        name = nm;
    }

    int get_score()
    {
        return score;
    }
    int get_roll()
    {
        return roll;
    }
    string get_name()
    {
        return name;
    }
};

bool pred(student a, student b)
{

    //如果所有细节都相同,则返回true,否则返回false-
    if (a.get_name() == b.get_name() && a.get_score() == b.get_score() && a.get_roll() == b.get_roll())
        return true;

    return false;
}

int main(){

    //第一个列表
    vector<student> arr1(5);
    //第一名学生
    arr1[0] = student(80, 5, "XYZ"); //卷5,标记80-
    //第二名学生
    arr1[1] = student(70, 10, "INC"); //卷10,标记70-
    //第三学生
    arr1[2] = student(85, 7, "HYU"); //卷7,标记85-
    //第四名学生
    arr1[3] = student(83, 1, "EFG"); //卷1,标记83-
    //第五名学生
    arr1[4] = student(81, 11, "ABC"); //卷11,标记81-

    //第二个列表
    vector<student> arr2(5);
    //第一名学生
    arr2[0] = student(80, 5, "XYZ"); //卷5,标记80-
    //第二名学生
    arr2[1] = student(70, 10, "INC"); //卷10,标记70-
    //第三学生
    arr2[2] = student(85, 7, "HYU"); //卷7,标记85-
    //第四名学生
    arr2[3] = student(83, 1, "EFG"); //卷1,标记83-
    //第五名学生
    arr2[4] = student(81, 11, "ABC"); //卷11,标记81-

    //查找检查两个列表是否相等 
    //基于用户定义的谓词
    if (equal(arr1.begin(), arr1.end(), arr2.begin(), pred))
        cout << "Both lists arr1,arr2 are equal\n";
    else
        cout << "Both lists arr1,arr2 are not equal\n";

    //第三列表
    vector<student> arr3(5);
    //第一名学生
    arr3[0] = student(89, 5, "PVR"); //卷5,标记89-
    //第二名学生
    arr3[1] = student(70, 10, "INC"); //卷10,标记70-
    //第三学生
    arr3[2] = student(85, 7, "HYU"); //卷7,标记85-
    //第四名学生
    arr3[3] = student(83, 1, "EFG"); //卷1,标记83-
    //第五名学生
    arr3[4] = student(81, 11, "ABC"); //卷11,标记81-

    //查找检查两个列表是否相等 based 
    //在用户定义的谓词上
    if (equal(arr1.begin(), arr1.end(), arr3.begin(), pred))
        cout << "Both lists arr1,arr3 are equal\n";
    else
        cout << "Both lists arr1,arr3 are not equal\n";

    return 0;
}

输出:

Both lists arr1,arr2 are equal
Both lists arr1,arr3 are not equal

在这里,我们首先创建了两个具有相同元素的列表。由于两个列表的大小相等,因此我们发现等于返回true。对于第二种情况,我们更改了arr3中的元素以使其不相等,并且在输出中反映出相同的内容。在我们用户定义的谓词中,如果所有细节都匹配两个学生,我们将返回true。

因此,在本文中,您看到了我们可以使用equal来检查两个范围是否相等的效率。这种方法的应用可以是检查一个数组是否是另一个数组的子数组。