Скажем, у меня есть код вроде:
typedef std::vector<std::vector<std::vector<long int> > > posHistory;
posHistory pHist (1, vector<vector<long int>>(1, vector<long int>(1,0)));
который отслеживал, например:
Как я могу добавить позицию для каждой дефекации?
Я имею:
направление = некоторое случайное число между -размерами и размерами (скажем, -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 в индекс, но как я могу это исправить?
Я пробовал кастинг, но это, похоже, не работает, хотя, возможно, я просто сделал это неправильно.
Короче, помогите?
Первый толчок назад дает мне ошибку:
saw.cpp:62:50: error: no matching function for call to ‘std::vector<std::vector<long int> >::push_back()’
Хм, похоже что 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&)’
С помощью foo[foo.size()]
для std::vector<T> foo
получает доступ к элементу foo
только за пределами диапазона foo
: массивы в C и C ++ начинаются с нуля, то есть вы можете получить доступ к индексам 0, ..., size()-1
, Доступ к элементу за пределами этого диапазона — неопределенное поведение.
Других решений пока нет …