假设我有一个小对象列表,我通过频繁的插入和删除来迭代(比如,在一个循环中)。但是,我遍历列表的顺序并不重要。我没有使用 std::list 来存储元素,而是考虑以下列方式使用 std::vector(用于固定时间删除):
插入:使用push_back在数组末尾插入。
删除:假设我想从大小为 n 的 vector 中删除位置 k 处的元素。然后,我将第 n 个(或 (n-1)st,取决于您如何看待)元素的内容复制到第 k 个元素并使用 pop_back。鉴于元素很小,复制操作的成本应该不会很高。
这是为了利用连续内存,而不必为每次插入动态分配内存。这种方法有缺点吗?我还注意到 C++11 有 unordered_set,但我认为这对于我正在尝试做的事情来说可能有点矫枉过正。
如果这个想法听起来很明显,我深表歉意。
最佳答案
您的想法是保持数组高效的基本方法。如果顺序对您来说真的无关紧要,我认为这是理想的方法。你可能想把它封装在一个类中(std::vector
的包装器),这样你就可以在多个地方使用它而不会重复代码,单独测试它并且通常遵循“单一责任”原则.
如果您可以访问 C++11 功能,您甚至不必复制第 n 个元素 - 您可以改为移动它,即使对于较重的对象也可以做到这一点。
关于c++ - 保持频繁插入和移除的小对象的无序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16179134/