1

QT に基づいてアプリケーションを開発しています。ダイナミック ( QVector ) でベクトルを使用する必要があります。ベクトルのサイズを確認すると、これは必要以上に高かったので、STL ベクトルでテストしましたが、結果は同じでした。以下に、STL ベクトルの問題を示すコードを示します。この状況では、ベクトルの実際のサイズを把握して適切に使用することができません。直し方?。ご協力ありがとうございました。

  • コンパイラ: GCC 4.5.2
  • OS: Linux Ubuntu 11.04
  • 観察: ベクトルの容量またはサイズは、常に基数 2 の累乗です。

コードは次のとおりです。

double PI = 3.1415926536, delta = PI/(100/2);
vector<double> A(0);
vector<double> B(0);
cout<<"Capacity A = "<<A.capacity()<<"; Capacity B = "<<B.capacity()<<endl;
for (int i = 0; i < 100; i++) {
    A.push_back(i*delta);
    B.push_back( sin( A[i]  ) );
    cout<<"A("<<i<<") = " <<A[i]<<"; B("<<i<<") = " <<B[i]<<" "<<"Size A = "<<A.capacity()<<"; Size B = "<<B.capacity()<<endl;
}

for (int i = 0; i < A.capacity(); i++) {
   cout<<"A("<<i<<") = " <<A[i]<<"; B("<<i<<") = " <<B[i]<<" "<<"Size A = "<<A.capacity()<<"; Size B = "<<B.capacity()<<endl;
}
cout<<"Size A = "<<A.capacity()<<"; Size B = "<<B.capacity()<<endl;

出力は次のとおりです。

Capacity A = 0; Capacity B = 0
A(0) = 0; B(0) = 0 Size A = 1; Size Y = 1    
A(1) = 0.0628319; B(1) = 0.0627905 Size A = 2; Size B = 2    
A(2) = 0.125664; B(2) = 0.125333 Size A = 4; Size B = 4    
A(3) = 0.188496; B(3) = 0.187381 Size A = 4; Size B = 4    
.    
A(99) = 6.22035; B(99) = -0.0627905 Size A = 128; Size B = 128    
.    
A(126) = 0; B(126) = 1.31947 Size A = 128; Size B = 128    
A(127) = 0; B(127) = 1.3823 Size A = 128; Size B = 128   
Size A = 128; Size B = 128
4

2 に答える 2

4

あなたが見ているstd::vectorのは、 のスケーリング能力です。一般的なケースでより速く動作させるために彼らが入れたものの1つは、必要以上のメモリを予約することpush_backでした.

ご覧のとおり、サイズが大きくなるほど、より多くの予約が確保されます。capacityこの量を教えてくれる関数です。を使用して、この理論をテストできますreserve。予約するメモリの量をベクトルに伝え、その後、capacity操作が行われない場合はその数を取得します (予約されたメモリに別の変更が発生する可能性があります)。多数の要素があり、ベクトルが十分なメモリを自動的に何回も予約するのではなく、一度だけ予約したいreserve場合に一般的に役立ちます。push_back

探している関数はsizeで、ベクトルの要素数を示します。これに関連する機能はresize、 でreserveあったようにcapacityです。つまり、 を呼び出すとresize (10)、以前に 5 つの要素があった場合、デフォルトで初期化された新しい要素が 5 つ取得され、size10 が返されます。

于 2012-06-19T00:56:17.493 に答える
0

なぜあなたはに興味がありますcapacityか?メモリ使用量に注目していますか?それ以外の場合、 capacity メソッドは必要ありません。サイズだけを気にする必要があります。

容量の詳細について話している場合、容量がどのように変化するかはベンダーの実装次第です。2 の累乗に基づいて配列を再割り当てするという事実は、すべてのケースに当てはまるとは限りません。たとえば、200% ではなく 150% の倍率でスケーリングする実装を見てきました。

capacity多くの場合、サイズよりも大きく、場合によってはかなり大きくなります (例: 要素数の 2 倍)。これは、ベクターが成長可能な連続したシーケンスであるためです (配列ベースです)。パフォーマンスをまったく気にする場合に最も避けたいことは、すべての push_back/insert/erase がメモリの割り当て/割り当て解除をトリガーすることです。そのため、vector は、後続の挿入にすぐに必要なサイズよりも大きな配列を作成することがよくあります。clearまた、メソッドが必ずしも容量に影響を与えるとは限らないことにも注意してください

完全に適合するように容量を完全に制御したい場合は、reserve メソッドを使用して事前に特定の容量を割り当てることができます。ただし、事前にベクトルに入れる要素の数を予測できる場合にのみうまく機能します。

于 2012-06-19T01:08:50.790 に答える