Максимальное значение вектора отображается как 0

Ввожу вектор A = {0,10}. Затем я добавляю 2 к каждому элементу, который меньше среднего, и вычитаю 2 из каждого элемента, который больше среднего. После этой операции новый вектор равен {2,8}, но когда я пытаюсь напечатать максимальное значение этого вектора, я почему-то получаю 0.

int smallestRangeI(vector<int>& A, int K) {
        int sum = 0;
        int avg = accumulate(A.begin(), A.end(), sum);
        avg = avg / A.size();
        for(int i = 0; i<A.size();i++)
        {
            if (A[i]<avg) A[i]=A[i]+K;
            else A[i]=A[i]-K;
        }
        return *max(A.begin(), A.end());
    }
int main() {
    vector<int> A = {0,10};
    int K = 2;
    cout<<smallestRangeI(A,K);
    return 0;
}

Пробовали ли вы выполнять в отладчике код за оператором, чтобы увидеть, что происходит и каковы результаты всех вычислений? Подсказка: для этого удобно размещать операторы в разных строках.

Some programmer dude 23.12.2020 18:26

Я рекомендую завершить вопрос, добавив недостающие заголовки. В данном случае это не имеет большого значения, но все, что мы должны изменить, чтобы ваш пример скомпилировался, является для нас шансом изменить поведение и случайно ввести еще одну ошибку или случайно исправить ту, которую вы ищете.

user4581301 23.12.2020 18:29

Кстати, вы неправильно используете sum. Вместо этого он должен выглядеть примерно так: int sum = accumulate(A.begin(), A.end(), 0); int avg = sum / A.size();

Remy Lebeau 24.12.2020 02:13

на самом деле я внес некоторые изменения в код в последнюю секунду и не мог отслеживать разумные имена переменных, лол. ну то что вы говорите абсолютно верно хаха

Prasanjeet Keshri 29.12.2020 18:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

std::max возвращает больший из двух элементов. Вы передаете ему два итератора, больший из которых A.end(), а затем разыменовываете его, что вызывает неопределенное поведение.

Похоже, что вместо этого вы ищете std::max_element, что дает вам итератор для наибольшего значения в A, которое вы затем можете разыменовать:

return *max_element(A.begin(), A.end());

Обратите внимание, что вы не должны разыменовывать этот итератор, если есть шанс, что A может быть пустым, так как это также приведет к неопределенному поведению. Кроме того, если A пусто, эта операция avg / A.size() приводит к делению на 0.

Что делает эта функция в случае, если A пусто, решать вам.

возможно, добавить проверку для итератора end. Все остальные функции в порядке с пустым вектором (... ну, не совсем все)

463035818_is_not_a_number 23.12.2020 18:27

@largest_prime_is_463035818 Очень хорошее замечание, добавлено к ответу, спасибо.

cigien 23.12.2020 18:29

@largest_prime_is_463035818 На самом деле остальная часть функции мне кажется нормальной. В цикле есть сравнение смешанных знаков, но это не должно ничего сломать.

cigien 23.12.2020 18:31

я сначала пропустил это: avg = avg / A.size();

463035818_is_not_a_number 23.12.2020 18:33

@largest_prime_is_463035818 Упс, это было небрежно. Спасибо большое, тоже добавил.

cigien 23.12.2020 18:35

Другие вопросы по теме