保持频繁插入和删除的小对象的无序列表

时间:2013-04-23 21:03:23

标签: c++

假设我有一个小对象列表,我通过频繁的插入和删除迭代(例如,在循环中)。但是,我遍历列表的顺序顺序并不重要。我没有使用std :: list来存储元素,而是考虑以下列方式使用std :: vector(用于常量时间删除):

插入:使用push_back插入数组的末尾。

删除:我想说我想从大小为n的向量中移除位置k处的元素。然后,我将第n个(或(n-1)st的内容,取决于你如何看待它)元素复制到第k个元素并使用pop_back。鉴于元素很小,复制操作不应该是昂贵的。

这是为了利用连续的内存,而不必为每次插入动态分配内存。这种方法有不利之处吗?我也注意到C ++ 11有unordered_set,但我认为这可能对我试图做的事情有点过分。

如果这个想法听起来很明显,我道歉。

2 个答案:

答案 0 :(得分:5)

您的想法是保持阵列高效的基本方法。如果订单对您来说无关紧要,我认为这是理想的方法。您可能希望将其封装在一个类(std::vector的包装器)中,以便您可以在多个位置使用它而无需重复代码,单独测试它并且通常遵循“单一责任”原则。

如果您可以访问C ++ 11功能,您甚至不必复制第n个元素 - 您可以移动它,即使对于较重的对象也可以这样做。

答案 1 :(得分:4)

鉴于你的要求相当宽松,我看不出这种方法的缺点。

另一个需要考虑的选择是,如果您的项目交换比复制更便宜,您可以将最后一项与要删除的项目交换,然后将当前交换的项目弹出结尾。

听起来unordered_set对你的需求来说太重了,因为它有你不需要的恒定时间find