Помогите пожалуйста исправить оишбку
Вот весь код, c++. итератор за пределы массива не выходит
#include <iostream>
using namespace std;
int main() {
short n, mx = -101, f = 0;
cin >> n;
int* mass = new int[n];
int mxindexes[100];
for (int i = 1; i <= n; i++)
{
cin >> mass[i];
if (mass[i] > mx)
{
mx = mass[i];
}
}
for (int i = 1; i <= n; i++)
{
if (mass[i] == mx)
{
mxindexes[f] = i;
f++;
}
}
for (int L = f; L >0; L--)
{
for (int i = mxindexes[L]; i <n; i++)
{
mass[i] = mass[i+1];
}
}
for (int i = 1; i <= n-f+1; i++)
{
mass[i] = mx;
}
for (int i = 1; i <= n; i++)
{
cout << mass[i] << " ";
}
}
Как это "итератор за пределы массива не выходит"?
А тут?
int* mass = new int[n];
.....
for (int i = 1; i <= n; i++)
{
if (mass[i] == mx)
{
Да и вы гарантируете, что дальше f не станет равным 100? Да и дальше натыкано много чего...
Посмотрите отладчиком, чему равны ваши значения индексов.
Вы помните (или нет?), что нумерация массивов в С++ начинается с нуля?
Или вот (то самое место, куда вы по случайности UB таки добрались...):
mxindexes[f] = i;
f++;
}
}
Итак, последний f - за пределами mxindexes. А тут вы
for (int L = f; L >0; L--)
{
for (int i = mxindexes[L]; i <n; i++)
начинаете работать с неинициализированным значением в mxindexes[L] (при первой итерации L равно f, т.е. за пределами инициализированной части...)
int* mass = new int[n];
Запомним, под mass выделено n элементов (с индексами от 0 до n-1).
for (int i = 1; i <= n; i++)
{
...
mass[i];
...
}
На последнем проходе будет i = n, значит будет обращение к mass[n].
for (int i = 1; i < n; i++)
{
...
mass[i+1];
...
}
На последнем проходе будет i = n - 1, значит будет обращение к mass[n].
И так по всем циклам практически.
Элементы массива в C++ (и многих других языках) нумеруются с нуля. Тут, например,
int n = 5;
int* mass = new int[n];
Я выделил память под массив из 5 интов, НО первый элемент в нем будет иметь индекс 0, а последний 4 (n-1) Это необходимо учитывать. Вы в комментариях писали:
И какая разница как нумеровать массив. в данном случае массив заполняю от 1 до n включительно, это то же самое, что от 0 до n-1
Не тоже самое ни разу. Вы в случае такого цикла
for (int i = 1; i <= n; i++)
{
if (mass [i] == mx){// код... }
}
Говорите машине:
Организуй мне, пожалуйста, цикл, и в нем проверь элементы массива, начиная с элемента
С ИНДЕКСОМ 1 (То есть второго) в массиве (То есть первый НЕ проверяй) До элемента с ИНДЕКСОМ n Включительно. (То есть ШЕСТОГО (n+1) по порядку).
Компилятор такой:
Хозяин, Вы выделили память только под n элементов, а n+1 элемента не существует и Вы обращаетесь к чужой памяти. Остановитесь и подумайте.
Компилятор вообще хороший парень, его надо слушать.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей