Накопить не дает правильную сумму моего вектора

У меня есть эта проблема:

int nCab = 11;
int nCabCombo;
std::vector<int>counter(nCab);
for(int i = nCab; i > 0; i--)
{
counter[i] = i-1;
std::cout<<counter[i]<<std::endl;
}
nCabCombo = std::accumulate(counter.begin(),counter.end(),0);
std::cout<<nCabCombo<<std::endl;

Выход для nCabCombo равен 45, когда он должен быть 55, по какой-то причине функция накопления не добавляет 10, что находится в индексе 11 моего вектора счетчика. Может кто-нибудь сказать мне, что я делаю не так здесь, пожалуйста? Спасибо!

1

Решение

counter[i] = i-1; //when i == 11, this is an off by one error

Массив, и, соответственно, вектор, имеет диапазон от [0, size), Если это имеет nCab элементы, максимальный индекс только nCab - 1, Вы храните последний элемент за пределами вектора. Вы должны изменить это на:

 counter[i - 1] = i-1;

Недостающий элемент был бы 10, когда accumulate работает, поэтому ваша сумма 10,

0

Другие решения

У вас нет индекса 11. У вас есть 11 элементов в вашем векторе, что означает, что допустимые индексы [0, 10], counter[i] = i-1; является неопределенным поведением, так как вы обращаетесь к одному за концом вектора.

Игнорирование UB ваш вектор на самом деле содержит {0,0,1,2,3,4,5,6,7,8,9} 45

Примечание: причина, по которой он не содержит -1 это цикл для работает i > 0 так i никогда не будет 0 и мы никогда не установим первый элемент вектора, чтобы он оставался 0 от построения вектора.

1

Как уже упоминалось, вы получаете доступ к элементу за пределами.

Однако вместо того, чтобы писать цикл и попадать в такие неприятности, вы можете использовать станд :: йота:

#include <vector>
#include <algorithm>

int main()
{
int nCab = 11;
std::vector<int>counter(nCab);
std::iota(counter.begin(), counter.end(), 0);
//...
}

Живой пример


Если по какой-то причине вы действительно хотите зациклить и заполнить массив в обратном порядке (высокий индекс к низкому индексу), вы можете использовать станд :: генерировать и использовать обратные итераторы:

#include <vector>
#include <algorithm>

int main()
{
int nCab = 11;
std::vector<int>counter(nCab);
int i = 11;
std::generate(counter.rbegin(), counter.rend(), [&i] {return --i;});
//...
}

Живой пример (std :: generate)

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector