Вектор имеет размер 0 до тех пор, пока вы не скажете, чтобы он изменил размер, или пока вы не инициализируете его с определенным размером. Передайте размер вашего вектора при его создании:
for(int i=1;i<112;i++){
n_2.push_back(vector<struct nodo>(112-i));
for(int j=1;j<112-i;j++){
n_2[i][j].last_prod=j;
}
}
Кроме того, похоже, что вы пропускаете 0-й индекс, что означает, что ваше первое значение в вашем массиве будет пропущено. Это, вероятно, нежелательно.
Наконец, если ваш массив имеет постоянный размер, рассмотрите возможность использования std :: array вместо std :: vector. Обратите внимание, что std :: array является функцией C ++ 11 и может быть недоступна в зависимости от вашего компилятора.
Если бы я писал этот код, я, вероятно, написал бы его так:
#include <array>
using namespace std;
// allocate an array of 112 <struct nodo> arrays, each of size 112
array<array<struct nodo, 112>, 112> n_2;
for (int i = 0; i < 112; i++)
{
for (int j = 0; j < 112; j++)
{
n_2[i][j].last_prod = j;
}
}
Или же, если у меня нет компилятора, который поддерживает C ++ 11:
#include <vector>
using namespace std;
// allocate a vector of size 112 of <struct nodo> vectors, each of size 112
vector<vector<struct nodo> > n_2(112, vector<struct nodo>(112));
for (int i = 0; i < 112; i++)
{
for (int j = 0; j < 112; j++)
{
n_2[i][j].last_prod = j;
}
}
Еще лучше, если вы используете одномерный вектор и просто рассматриваете его как двумерный вектор. Таким образом, вы можете сделать одно выделение памяти одновременно, а не 112 меньших выделений. Это выглядит довольно придирчиво, но очевидно, что решение O (1) лучше, чем решение O (n), которое лучше, чем решение O (n ^ 2) с точки зрения распределения, поскольку распределение медленное.