0

質問

struct次のようなものがあるとしましょう。

struct MyStruct
{
  enum Type { NONE, TYPE1, TYPE2 };
  Type type;
  int value;
}

ここで、アプリケーションは、未定義の量のこれらの構造体を配列などに格納する必要があります。問題は、メモリ使用量、速度、エレガンスなどの観点から、これを行うための最良の方法はどれでしょうか?

いくつかの考慮事項

  1. 追い越されないことがわかっている長さの固定長配列を作成するには:

    MyStruct myStructArray[200];
    

    これにより、着信構造体インスタンス用のスペースが予約されるため、メモリ使用量が増えると思います。

  2. vector<MyStruct>それ自体でメモリを管理するような、自動サイズ変更可能な配列メカニズムを持つこと。

  3. それぞれへのポインターをstructいくつかの配列またはに格納しますvector

4

3 に答える 3

4

std::vector<MyStruct>より良いオプションです。ある意味でベクトルに非常に近い別のオプションもあり、 と呼ばれ std::dequeます。それを見てください。多分それはあなたを助けるか、少なくとも標準的なコンテナの認識を高めるでしょう. オンラインドキュメントによると、

とは対照std::vector的に、両端キューの要素は連続して格納されません。典型的な実装では、個別に割り当てられた固定サイズの配列のシーケンスを使用します。

両端キューのストレージは、必要に応じて自動的に拡張および縮小されます。std::vector既存の要素を新しいメモリ位置にコピーする必要がないため、deque の展開は a の展開よりもコストがかかりません。

std::dequeは連続したメモリに要素を保存しませんが、 とほとんど同じように動作しRandomAccessIteratorますstd::vector

于 2013-08-02T09:20:07.840 に答える
2

std::vector<>実行時にサイズが変化する可能性がある場合に使用しstd::array<>、固定されている場合に使用します。a の要素を追加および削除する労力は astd::deque<>よりも少なくなりますが、連続したメモリにデータを提供しますstd::vector<>vector<>線形トラバーサルの場合、はるかにキャッシュフレンドリーです。これにより、トラバーサル中にキャッシュ ミスにつながるメモリ内に分散できる btree などに依存するコンテナーと比較して、パフォーマンスが向上します。

于 2013-08-02T09:31:06.840 に答える