c++ - 实现《战地》3's std::vector swap trick to "删除/添加“一个元素

标签 c++ algorithm c++11 vector

我正在尝试实现一种算法,并且偶然发现了 DICE 的“交换技巧”,如 here 所描述的那样。 (幻灯片 19)。

据我了解,我们首先创建一个包含所有元素的 vector ,然后当需要删除某个元素时,将其与最后一个元素交换,然后减小 vector 的“大小”。这个“大小”是一个外部变量,用于跟踪我们的“虚拟”大小(因为 vector doesn't support this internally )。

注意:排序/排序并不重要。另外,当我说“删除”时,没有任何内容被取消分配,它只是说该元素被移动到“可用”范围之外。

现在,当需要将一个元素(从已删除的元素中)添加回 vector 的可用部分时,我们需要将其交换回某个地方。这就是我有点阻碍的地方。因为,当我们交换它时,我们可以将它与本次迭代中需要存在的元素交换,并且需要将这个相同的元素交换回去,依此类推...

这是一个如何工作的示例:

迭代1:|1 2 3 4| (尺寸4)

迭代 2:|1 3| 2 4(大小为 2,元素“2”和“4”仍在内存中,但不计入 vector 的大小)

迭代3:|2 1 3| 4(尺寸 3,元素“4”仍然存在)

我可能想得太多了,但如果有人知道如何正确使用这个算法,那将会很有帮助。

感谢您的帮助。

最佳答案

将其与第一个不可用的元素交换,然后增加虚拟大小。例如,假设这是您的 vector :

  // usable         unusable
{ 0, 1, 2, 3,       4, 5, 6, 7, 8 } // virtual size = 4

现在假设您要将 7 从不可用部分移至可用部分。您将其与 4 交换,因为这是第一个不可用的元素。然后你将你的虚拟大小增加 1。所以现在你的 vector 看起来像这样:

  // usable         // unusable
{ 0, 1, 2, 3, 7,    5, 6, 4, 8 } // virtual size = 5

关于c++ - 实现《战地》3's std::vector swap trick to "删除/添加“一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39185207/

相关文章:

php - 如何重新排列数组项,将依赖项移动到顶部?

algorithm - 不断更新中位数+空间效率

c++ - 如何使用 C++11 或 Boost 获取正则表达式匹配的长度?

c++ - 如何跟踪 STL 库分配的内存

c++ - 捕获控制台/终端关闭事件的平台独立方式

c# - VLClib 错误 : ES_OUT_RESET_PCR

c++ - OpenGL 着色器编译错误

java - 光线转换算法中连接光线的问题

C++ 文件解析参数个数

c++ - 从 C++ 文本文件中读取复数 (a+bi)