C++ |使用 std::mismatch(或其他 STL 替代方法)比较两个数组

C++ | Comparing two arrays using std::mismatch (or another STL alternative)

我面临着比较两个 int 数据类型的 C++ 数组的任务。我特别不能使用我自己的任何循环(forwhile),并被鼓励使用 STL 函数。我找到了 std::mismatch(),这似乎是我想要的,但我无法让它与基本数组一起工作。

这是我的代码:

#include <iostream>     // cout
#include <algorithm>    // std::mismatch
#include <utility>      // pair

int main()
{
    int a[10] = {1,3,5,7,9,11,13,15,17,19};
    int b[10] = {2,4,6,8,10,12,14,16,18,20};

    std::pair<int, int> result = 
        std::mismatch(a, a + 9, b);
    
    std::cout<<result.first<<" "<<result.second<<std::endl;

    return 0;
}

我收到以下错误:

error: conversion from 'std::pair' to non-scalar type 'std::pair' requested

我是 C++ 的新手,所以我真的不知道这意味着什么。

std::mismatch() returns std::pair 个迭代器。在您的示例中,您正在使用 int* 类型的迭代器(int[] 数组 decays 指向指向其第一个元素的 int* 指针)。因此,您需要将 result 变量从 pair<int, int> 更改为 pair<int*, int*>。然后你需要在将它们的值打印到 cout 时取消引用这些迭代器,例如:

#include <iostream>     // cout
#include <algorithm>    // std::mismatch
#include <utility>      // pair

int main()
{
    int a[10] = {1,3,5,7,9,11,13,15,17,19};
    int b[10] = {2,4,6,8,10,12,14,16,18,20};

    int *a_end = a + 10;
    std::pair<int*, int*> result = std::mismatch(a, a_end, b);

    if (result.first != a_end)
        std::cout << *(result.first) << " " << *(result.second) << std::endl;
    else
        std::cout << "no mismatch found" << std::endl;

    return 0;
}

std::mismatch returns 一对指向容器的迭代器,而不是一对 int。在这种情况下,由于您有一个数组,因此迭代器类型为 int*.

简单的解决方案是在调用它时推导类型:

auto result = std::mismatch(a, a + 9, b);

从 c++17 开始,您也可以命名该对的各个元素:

auto [i, j] = std::mismatch(a, a + 9, b);