私は以下を使用しています:
vector < vector < unsigned int > > paths;
しかし、そこには 647 278 行しか追加できないようです。各行に10個の数字があります。
私は各反復でこれを呼び出します:
paths.resize(paths.size() + 1, vector < unsigned int >(10));
すべての反復を呼び出すよりも良い方法はありますか? また、変更されないため、常に列数を指定する必要がありますか?
私は以下を使用しています:
vector < vector < unsigned int > > paths;
しかし、そこには 647 278 行しか追加できないようです。各行に10個の数字があります。
私は各反復でこれを呼び出します:
paths.resize(paths.size() + 1, vector < unsigned int >(10));
すべての反復を呼び出すよりも良い方法はありますか? また、変更されないため、常に列数を指定する必要がありますか?
確かではありませんが、このstd::vector の説明 では、ベクトル ストレージがメモリ内の 1 つの連続した場所にあることが指摘されています。つまり、ベクトルはメモリ内の 1 つの大きなブロックに格納されます。
これを別のベクトル (大きな配列) に分割しようとしましたか?
pyCthon が指摘しているように、 this other questionsize_t
は、アーキテクチャの最大値を許容するのに十分な大きさであることが保証されているため、ここでサイズに使用するのに適切なタイプであると説明しています。
次に、.resize()
メソッドを毎回呼び出す必要はありません。代わりに、新しいベクターを構築し、.push_back(newvec)
それをベクターに追加します。内部アロケーターは、適切と思われるスペースを割り当てます。一般的には、これが最適なオプションです。一般に、ここで重要な O(log n) の再割り当てが必要になります。より多くのスペースが必要なためにベクトルを再割り当てする必要がある場合は、配列全体を新しいメモリ ブロックに継続的に再コピーすることになる可能性があります。
さらに良いことに、最初に配列の合計サイズを計算できる場合は、そうしてください。そうすれば、最初にブロック全体を割り当てるため.reserve(size)
、 を呼び出してから各要素に使用すると、最初に1つの割り当てしかありません。.push_back()
ベクターがアーキテクチャで使用できる要素の最大数を知りたい場合は、vector::max_size() を呼び出します。cplusplus.com の例:
// comparing size, capacity and max_size
#include <iostream>
#include <vector>
using namespace std;
int main ()
{
vector<int> myvector;
cout << "max_size: " << myvector.max_size() << "\n";
return 0;
}
これを ideone.com で実行すると、すぐに最大サイズが 1,073,741,823 になり、ベクターが a の場合はvector< vector< unsigned int > >
357,913,941 になります。