2

と仮定する

vector<vector<shared_ptr<Base>>> vec
vec.reserve(100)
vec[0].reserve(20)  // Error : vector subscript out of range

外部ベクトルと内部ベクトルの両方にメモリを予約しようとしています。が空であることはわかっているvecため、内部ベクトル用にメモリを予約できません。私は、resize()またはshrink_to_fit()後でできました。しかし、それは私がやりたかったことではないので、resize()orは役に立ちません。shrink_to_fit()

内部ベクトル用にメモリを予約する意図は、後で内部要素をより高速に検索できるようにメモリを適切に割り当てようとすることです。事前に割り当てられたメモリは高価で混乱しています。

私は質問したい :

  1. 内部ベクトル用にメモリを予約する方法はありますか
  2. 「ベクトル用にメモリを確保しないと、メモリの割り当て不良が発生するのではないか」という私の考えは正しいですか?

VC++ 2010 を使用しており、英語が下手で申し訳ありません。

4

3 に答える 3

5

内部ベクトルと外部ベクトルの両方にメモリを予約することはできません...外部ベクトルのスペースのみを予約した場合、内部ベクトルは構築されません。外側のベクトルのサイズを変更してから、その要素ごとに予約するか、追加された内側のベクトルを予約することができます。

于 2013-04-25T17:20:51.573 に答える
2

これを行う必要があると確信している場合は、おそらく外側のベクトルのサイズを変更してから、各内側のベクトルにスペースを確保します。

100 要素が正確に近い場合でも、外側のベクトルのスペースはほとんど関係ありません (通常、32 ビット システムでは 1200 バイト、64 ビット システムでは 2400 バイトのようになります)。

これは少し不便かもしれません (作成された項目と実際に使用されている項目の数を追跡する必要があるかもしれません) が、内部ベクトルにスペースを確保したい場合、選択肢はあまりありません。

于 2013-04-25T17:21:03.343 に答える
0

最終的なコンテナーとどのようにやり取りするか、およびその内容について事前に知っていることから始めます。便利なインターフェイスに落ち着いたら、その背後にあるコードを実装できます。たとえば、すべての新しい内部ベクトルが 100 要素の容量で作成されるようにすることができます。または、x/y ペアから共有ポインターへのマップを使用することもできます。これは、データがまばらなコンテナーでは意味があります。または、100x100 要素を静的に割り当て、再割り当てをまったく行わないのはどうですか? 重要な点は、最終的なコンテナーへのインターフェイスを変更せずにこれらすべての代替手段を実装できるため、さまざまなアプローチを自由に試すことができるということです。

ところで:shared_ptrの割り当てオーバーヘッドを回避するmake_sharedをチェックしてください。あるいは、Boost には、内部参照カウンターを使用する intrusive_ptr もあります。これらの shared_ptr インスタンスも、shared_ptr の半分のサイズにすぎません。ただし、どの方法が最速かを実際に証明するには、ベンチマークが必要です。それ以外は、多かれ少なかれ漠然とした憶測と当て推量にすぎません。

于 2013-04-25T19:11:37.310 に答える