c++ - 保持频繁插入和移除的小对象的无序列表

标签 c++

假设我有一个小对象列表,我通过频繁的插入和删除来迭代(比如,在一个循环中)。但是,我遍历列表的顺序并不重要。我没有使用 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/

相关文章:

c++ - 头文件中的 iterator_range

c++ - SDL(简单媒体直接层)尝试缩放我的 Sprite (角色)

c++ - 为什么写入我的字符串不起作用?

c# - 嵌入式单声道 : How do you raise an event in C++?

c++ - 在 c 中键入不存在的结构

c++ - 如果我知道 gdb 的类型,我怎么能看到 boost::any 的值

iphone - 在 iOS 上使用 std 写入文件

c++ - 在 netbeans 中运行 makefile 时找不到 sdl2-config 可执行文件

c++ - 代码只打印一个倍数而不是 3 个

c++ - 优化标准迭代算法