Ошибка Exception unhandled

Помогите пожалуйста исправить оишбкувведите сюда описание изображения

Вот весь код, 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] << " ";
    }

}

Ответы (3 шт):

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

Как это "итератор за пределы массива не выходит"?

А тут?

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, т.е. за пределами инициализированной части...)

→ Ссылка
Автор решения: CrazyElf
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].

И так по всем циклам практически.

→ Ссылка
Автор решения: Konstantin_SH

Элементы массива в 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 элемента не существует и Вы обращаетесь к чужой памяти. Остановитесь и подумайте.

Компилятор вообще хороший парень, его надо слушать.

→ Ссылка