Итератор принимает значение нуля

 cout << "Реализация списка: " << endl;
    int skdf = rand()%10 +20;
    vector<int> spisok(skdf);
    vector<int>::iterator it;
    it = spisok.begin();
    for(advance(it, 0); it != spisok.end(); it++)
    {
        *it = rand()%100 -50;
    }
    int spisok_summa = 0;
    for(advance(it, 0); it != spisok.end(); it++)
    {
        spisok_summa += *it;
    }
    cout << spisok_summa << " - сумма чисел в списке" << endl;
    cout << spisok_summa/skdf << " - среднее арифмитическое списка" << endl;
    
    advance(it, 0);
    while(*it < 0)
        it++;
    int min1 = 0;
    min1 = *it;
    for(it; it != spisok.end(); it++)
    {
        if(*it > 0 and *it < min1)
            min1 = *it;
    }
    cout << min1 << " - наименьшее положительное число списка" << endl;
    
    for(advance(it, 0); it != spisok.end(); it++)
    {
        if(*it > 0)
            *it = min1*min1;
        cout << *it << " - элемент списка" << endl;
    }

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

Реализация списка:

0 - сумма чисел в списке

0 - среднее арифмитическое списка

0 - наименьшее положительное число списка

Program ended with exit code: 0


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

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

Дело в том, что

advance(it, 0);

не выставляет итератор на начало. Так что вы пытаетесь работать с итератором, указывающим за конец списка...

Вот тут

cout << spisok_summa/skdf 

у вас целочисленное деление, с отбрасыванием дробной части результата... С использованием случайного равномерного заполнения в вашем диапазоне скорее всего получится 0.

Вот так

while(*it < 0)

я бы не рекомендовал поступать — а вдруг в списке будут только отрицательные значения?...

Замените соответствующий фрагмент вот таким:

vector<int>::iterator it;

for(it = spisok.begin(); it != spisok.end(); it++)
{
    cout << (*it = rand()%100 -50) << "  ";
}
cout << endl;

int spisok_summa = 0;

for(it = spisok.begin(); it != spisok.end(); it++)
{
    spisok_summa += *it;
}

cout << spisok_summa << " - сумма чисел в списке" << endl;
cout << double(spisok_summa)/skdf << " - среднее арифмитическое списка" << endl;

it = spisok.begin();
while(*it < 0)
    it++;
→ Ссылка
Автор решения: Виктор

Чем Вас не устраивает такой вариант:

for (auto elem : spisok) {
    spisok_summa += elem;
}
cout << spisok_summa << " - сумма чисел в списке" << endl;
cout << double(spisok_summa)/skdf << " - среднее арифмитическое списка" << endl;
→ Ссылка