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 之间,数量ITEMSORDER1 到 500 之间。

问题是,当我构建时ORDER_SET,我不知道会有多少 ORDER。我知道当我添加一个ORDER有多少项目时。这里有一些问题:

1) 理想情况下,一旦我使用 Orders.resize() 为所有 ORDER 分配内存,我就可以重用内存,但似乎Orders.clear()确实将其全部删除。

2)我从一个有点合理的订单大小开始,比如Orders.resize(500,000),但问题是当我遇到大量订单时,订单向量的调整大小需要永远,因为它必须复制所有ORDER.item向量。

似乎与存储备用矩阵类似,问题是在我创建它之前我也不知道结构会有多大。

附加信息:
1)使用 Visual Studio 2008 2)正如在下面的评论中发布的那样,我能够在合理的时间内通过替换两个字段 来改进ORDER_SET包含 10000000 个订单的构造:items

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

我将所有 pItems 放入一个单独的向量中,以便稍后删除。

现在剩下的大问题是调用似乎ORDER_SET.Orders.clear()需要相当长的时间。我不确定为什么。

有没有像 clear() 这样的调用,它不会释放内存,而只是设置endbegin?一旦向量变得那么大,就没有任何理由释放内存,因为我可能再次需要它。

4

1 回答 1

1

第二个问题可以通过使用带有vectors 移动语义的 C++11 来解决,因此ORDER可以移动,而不仅仅是深度复制。

ORDER.Orders.clear()需要一些时间,因为它必须在所有元素上调用析构函数。

于 2013-08-02T21:09:37.477 回答