#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;
}