C | Сравнение двух массивов с использованием std::mismatch (или другой альтернативы STL)

#c #arrays #stl #mismatch

#c #массивы #stl #несоответствие

Вопрос:

Я столкнулся с задачей сравнения двух массивов c , которые имеют тип int данных. Я специально не могу использовать какие-либо собственные циклы ( for , while ), и мне было предложено использовать функцию 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;
}
  

Я получаю следующую ошибку:

ошибка: запрошено преобразование из ‘std:: pair’ в нескалярный тип ‘std::pair’

Я довольно новичок в C , поэтому я действительно не знаю, что это значит.

Комментарии:

1. Это не решает вопрос, но конечный итератор для массива из 10 элементов a 10 — нет a 9 . Еще лучше, однако, использовать std::begin(a) , std::end(a) , и std::begin(b) . Таким образом, если вы измените количество элементов в a , вы все равно получите правильный конечный итератор.

Ответ №1:

std::mismatch возвращает пару итераторов в контейнер, а не пару int s. В этом случае, поскольку у вас есть массив, тип итератора равен int* .

Простое решение — вывести тип при его вызове вместо этого:

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

Начиная с c 17, вы также можете называть отдельные элементы пары:

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

Ответ №2:

std::mismatch() возвращает std::pair число итераторов. В вашем примере вы используете итераторы типа int* ( int[] массив распадается до int* указателя на его 1-й элемент). Итак, вам нужно изменить вашу 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;
}