【问题标题】:C++ implementation of an array of vectors向量数组的 C++ 实现
【发布时间】:2015-03-20 22:34:43
【问题描述】:

背景:我想实现一个 3-d 碰撞检测算法,并且想将搜索空间分割成立方体,这样我只在对象足够近时才检查碰撞。

实际问题:我正在考虑使用向量数组来存储指向要迭代的对象的指针。例如 box[0][0][0] 将是一个向量,其中包含指向模拟空间一个角落的对象的指针。无论这是否是最佳解决方案,我都想知道 c++ 如何处理向量数组。数组是否会保存指向向量的指针,以便它们随后的重新分配对数组的有效性没有影响,或者向量是否会在数组内部创建然后移出,从而导致未定义的行为?

类似问题没有针对此实施细节的具体答案。对不起,如果这实际上在其他地方得到了回答,我错过了。

【问题讨论】:

  • 如果您使用向量,则使用向量来保存向量。如果您知道编译时的大小,也可以使用std::array
  • 问题更多是关于向量如何存储在内存中,而不是我将如何实现这个特定项目,但感谢您的建议。
  • 3d 数组想法的唯一问题是它在最坏情况下的性能非常差。最坏的情况是模拟中的所有内容都在 box[x][y][z] 中,而所有其他框都是空的。根据域中实体的数量及其相对大小,您可能只考虑单个平面数组,而不是尝试对空间进行分区。
  • 我使用的球体倾向于在 x 和 z 轴上均匀分布,但不在 y 轴上(因为它们最终会在地板上)所以我认为二维分区是最好的解决方案。但是,出现的问题实际上是关于向量数组的行为方式,而不是解决这个问题的最佳方法。这将保证它自己的问题。

标签: c++ arrays vector


【解决方案1】:

STL 向量包含一个指向包含实际数据的堆缓冲区的指针。这允许向量根据需要调整缓冲区的大小,而不会使向量对象本身无效。 (见documentation of vector

所以,回答你的问题。如果需要调整其中一个向量的大小,则向量数组不会变为无效。如果需要调整其中一个向量的大小,则指向向量的指针数组也不会变得无效。

【讨论】:

  • 那么数组将包含 Vector 对象,这些对象本身包含指向实际数据的指针?那么,我可以期望 Vector 对象永远不会分配,对吗?在您分享的链接中似乎并没有明确说明,尽管它是有道理的。
  • @patatahooligan:向量可能会重新分配其内部使用的堆内存,导致迭代器无效,但向量 itef 将始终有效。见iterator invalidation rules
【解决方案2】:

在 STL 中,向量是动态数组(可以动态驻留的数组)的实现。这实质上意味着数组是动态分配的,用户在堆上获得指向数组的指针。当需要更多空间时,分配一个新数组(通常是原来大小的两倍),复制旧数组的内容并释放旧数组。这就是处理数据一致性的方式。

现在,当您有一个向量数组,如问题所示静态分配时,您在内存(堆栈或 .data 部分,取决于您声明此数组的位置)中有一个或 3 个向量对象,一个接一个地分配在内存中,每一个都将持有一个指向堆上分配的数组的指针。

我希望这能回答你的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多