サイズを変更するように指示するまで、または特定のサイズで初期化しない限り、ベクトルのサイズは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::vectorではなくstd::arrayの使用を検討してください。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;
}
}
さらに理想的には、1次元のベクトルを使用し、それを2次元のベクトルとして扱う必要があります。このようにして、112の小さな割り当てではなく、一度に1つのメモリ割り当てを行うことができます。これはかなり厄介になっていますが、割り当てが遅いため、割り当ての点でO(n)ソリューションよりもO(1)ソリューションの方が優れていることは明らかです。