Как исправить ошибку С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 шт):

Автор решения: Harry

Для начала... Вы с какого языка на С++ перебираетесь? Вот это

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(),

вам явно нужны скобки вокруг разности...

Может, есть и еще что, но начните с этих ошибок...

→ Ссылка