1

次のような一連の構造があります。

typedef struct {
   int a;
   int b;
} ITEM;

typedef struct {
   int orderID;
   std::vector<ITEM> items;
} ORDER;

typedef struct {
   int orderSetID;
   std::vector<ORDER> Orders;
} ORDER_SET;

問題は、注文数が 100,000 ~ 10,000,000 の範囲であり、注文数が1 ~ 500ITEMSの範囲であるということです。ORDER

問題は、私が を構築しているときORDER_SET、いくつの ORDER があるか分からないことです。アイテムを追加すると、いくつのアイテムがあるORDERかがわかります。ここにいくつかの問題があります:

1) 理想的には、Orders.resize() を使用してすべての ORDER にメモリを割り当てたら、メモリを再利用できますが、Orders.clear()すべて削除されているようです。

2) Orders のある程度妥当なサイズから始めますOrders.resize(500,000)が、問題は、多数の注文をヒットすると、すべてのORDER.itemベクトルをコピーする必要があるため、Orders ベクトルのサイズ変更に永遠にかかることです。

スペア マトリックスの格納と同様の問題のように思えます。問題は、構造を作成する前に構造がどれくらい大きくなるか分からないことです。

追加情報:
1) Visual Studio 2008 の使用 2) 以下のコメントに投稿されているように、次の2 つのフィールドを ORDER_SET置き換えることで、妥当な時間内に 10000000 注文を含むan の構築を改善することができました。items

typedef struct {
    int orderID;
   ITEM singleItem;
   std::vector<ITEM> *pItems;
} ORDER;

すべての pItems を別のベクターに入れ、後で削除するために使用します。

残された大きな問題は、呼び出しORDER_SET.Orders.clear()にかなりの時間がかかるように見えることです。理由はわかりませんが。

endclear() のように、メモリを解放せずに設定するだけの呼び出しはありbeginますか? ベクトルが大きくなると、メモリが再び必要になる可能性があるため、メモリを解放する理由はまったくありません。

4

1 に答える 1

1

vector2 番目の問題は、 s の移動セマンティクスで C++11 を使用することで修正できるためORDER、単にディープ コピーするだけでなく、移動することもできます。

ORDER.Orders.clear()すべての要素でデストラクタを呼び出す必要があるため、時間がかかります。

于 2013-08-02T21:09:37.477 に答える