Использование `.size ()` в качестве индекса массива

Скажем, у меня есть код вроде:

typedef std::vector<std::vector<std::vector<long int> > > posHistory;
posHistory pHist (1, vector<vector<long int>>(1, vector<long int>(1,0)));

который отслеживал, например:

  • Количество собак.
  • Количество раз делает шаг.
  • Положение каждого шага. (длина шага единицы (1))

Как я могу добавить позицию для каждой дефекации?
Я имею:

направление = некоторое случайное число между -размерами и размерами (скажем, -2,2 для 2d)
tdof = поступательные степени свободы, по существу, каждая ось.

for (unsigned int tdof = 0; tdof < dimensions; tdof++)
{
if (fabs(direction) < tdof)
{
walkHist[(int) walkHist.back()][(int) walkHist[walkHist.back()].size()][tdof] = (long int) copysign(1, direction);
}
}

Часть, которая доставляет мне неприятности:

walkHist[walkHist.size()-1][walkHist[walkHist.size()-1].size()][ (long int) copysign(1, direction)];

И позже в коде у меня есть:

walkHist[(walkHist.size()-1)].push_back();
walkHist.push_back();

Я уверен, что проблема заключается в преобразовании size_type в индекс, но как я могу это исправить?

Я пробовал кастинг, но это, похоже, не работает, хотя, возможно, я просто сделал это неправильно.
Короче, помогите?

Редактировать 1

Первый толчок назад дает мне ошибку:

saw.cpp:62:50: error: no matching function for call to ‘std::vector<std::vector<long int> >::push_back()’

Редактировать 2

Хм, похоже что walkHist.at(walkHist.back()).size() дает мне:

saw.cpp:49:52: error: no matching function for call to ‘std::vector<std::vector<std::vector<long int> > >::at(__gnu_cxx::__alloc_traits<std::allocator<std::vector<std::vector<long int> > > >::value_type&)’

1

Решение

С помощью foo[foo.size()] для std::vector<T> foo получает доступ к элементу foo только за пределами диапазона foo: массивы в C и C ++ начинаются с нуля, то есть вы можете получить доступ к индексам 0, ..., size()-1, Доступ к элементу за пределами этого диапазона — неопределенное поведение.

2

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

Других решений пока нет …

По вопросам рекламы [email protected]