Ввожу вектор 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;
}
Я рекомендую завершить вопрос, добавив недостающие заголовки. В данном случае это не имеет большого значения, но все, что мы должны изменить, чтобы ваш пример скомпилировался, является для нас шансом изменить поведение и случайно ввести еще одну ошибку или случайно исправить ту, которую вы ищете.
Кстати, вы неправильно используете sum
. Вместо этого он должен выглядеть примерно так: int sum = accumulate(A.begin(), A.end(), 0); int avg = sum / A.size();
на самом деле я внес некоторые изменения в код в последнюю секунду и не мог отслеживать разумные имена переменных, лол. ну то что вы говорите абсолютно верно хаха
std::max
возвращает больший из двух элементов. Вы передаете ему два итератора, больший из которых A.end()
, а затем разыменовываете его, что вызывает неопределенное поведение.
Похоже, что вместо этого вы ищете std::max_element
, что дает вам итератор для наибольшего значения в A
, которое вы затем можете разыменовать:
return *max_element(A.begin(), A.end());
Обратите внимание, что вы не должны разыменовывать этот итератор, если есть шанс, что A
может быть пустым, так как это также приведет к неопределенному поведению. Кроме того, если A
пусто, эта операция avg / A.size()
приводит к делению на 0.
Что делает эта функция в случае, если A
пусто, решать вам.
возможно, добавить проверку для итератора end
. Все остальные функции в порядке с пустым вектором (... ну, не совсем все)
@largest_prime_is_463035818 Очень хорошее замечание, добавлено к ответу, спасибо.
@largest_prime_is_463035818 На самом деле остальная часть функции мне кажется нормальной. В цикле есть сравнение смешанных знаков, но это не должно ничего сломать.
я сначала пропустил это: avg = avg / A.size();
@largest_prime_is_463035818 Упс, это было небрежно. Спасибо большое, тоже добавил.
Пробовали ли вы выполнять в отладчике код за оператором, чтобы увидеть, что происходит и каковы результаты всех вычислений? Подсказка: для этого удобно размещать операторы в разных строках.