gpt4 book ai didi

c++ - 您将如何管理结构的 std::vector 和 std::vectors 在两个维度上都具有大范围的大小?

转载 作者:太空宇宙 更新时间:2023-11-04 11:51:29 25 4
gpt4 key购买 nike

我有一组结构类似于:

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 之间,ORDER 中的 ITEMS 数量在 1 到 500 之间。

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

1) 理想情况下,一旦我使用 Orders.resize() 为所有 ORDER 分配内存,我就能够重用内存,但看起来 Orders.clear() 确实全部删除。

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

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

附加信息:
1) 使用 Visual Studio 20082) 如下面的评论中所述,我能够在合理的时间内通过将 items 替换为两个字段来改进 ORDER_SET 的构造,其中包含 10000000 个订单:

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

我将所有 pItem 放入一个单独的 vector 中,稍后我将使用该 vector 进行删除。

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

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

最佳答案

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

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

关于c++ - 您将如何管理结构的 std::vector 和 std::vectors 在两个维度上都具有大范围的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18025031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com