Как исправить ошибку С2677 С++?
Пишу программу для нахождения локальных экстремумов в последовательности. С точки зрения алгоритма - он достаточно тривиален, однако возникает ошибка:
C2677 бинарный "==": не найден глобальный оператор, принимающий тип "const _Ty" (или приемлемое преобразование отсутствует)
with
[
_Ty=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>
] Project1 C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility 6010
Мой полный код решения задачи:
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector<int> vec;
int a, b;
cin >> a;
for (int i = 0; i < a; ++i) {
cin >> b;
vec.push_back(b);
}
vector<long long> mins;
vector<long long> maxs;
int cnt_min = 0, cnt_max = 0;
for (int i = 0; i < a; i++) {
if (i == 0) {
if (vec[i] < vec[i + 1]) {
cnt_min++;
mins.push_back(i + 1);
}
else if (vec[i] > vec[i + 1]) {
cnt_max++;
maxs.push_back(i + 1);
}
}
else if (i == vec.size()) {
if (vec[i] < vec[i - 1]) {
cnt_min++;
mins.push_back(i + 1);
}
else if (vec[i] > vec[i - 1]) {
cnt_max++;
maxs.push_back(i + 1);
}
}
else {
if (vec[i - 1] > vec[i] < vec[i + 1]) {
cnt_min++;
mins.push_back(i + 1);
}
else if (vec[i - 1] < vec[i] > vec[i + 1]) {
cnt_max++;
maxs.push_back(i + 1);
}
}
}
cout << cnt_min;
for (int i = 0; i < mins.size(); ++i) {
cout << ' ' << mins[i];
}
cout << "\n" << cnt_max;
for (int i = 0; i < maxs.size(); ++i) {
cout << ' ' << maxs[i];
}
cout << "\n" << vec.end() - find(vec.begin(), vec.end(), min(vec.begin(), vec.end()));
cout << ' ' << vec.end() - find(vec.begin(), vec.end(), max(vec.begin(), vec.end()));
return 0;
}
Ответы (1 шт):
Для начала... Вы с какого языка на С++ перебираетесь? Вот это
vec[i - 1] > vec[i] < vec[i + 1]
совсем не то, что вы хотите; то, что вы хотите, пишется так:
vec[i - 1] > vec[i] && vec[i] < vec[i + 1]
Далее, в
min(vec.begin(), vec.end())
вы пытаетесь сравнивать итераторы. Если вы хотите найти минимальный элемент, так это делает min_element
, которая, кстати, возвращает итератор (на всякий случай напомню).
В третьих (и это ответ на ваш вопрос), вы передаете в find
значение итератора, с которым find
сравнивает значения вектора vec
, т.е. значения типа int
. Но int
с итератором с помощью оператора ==
сравнивать нельзя. Компилятор сообщает именно об этом.
В четвертых, даже если вы замените вызов find
на правильный, что вы хотите получить этим?
vec.end() - find(vec.begin(), vec.end(), ...
См. функцию distance
, это вернее :)
Но даже если допустить... Но тут:
cout << vec.end() - find(vec.begin(), vec.end(),
вам явно нужны скобки вокруг разности...
Может, есть и еще что, но начните с этих ошибок...