我会给出一些关于我为什么要这样做的背景,但最终可以忽略背景,因为它主要是一个经典的计算机科学和 C++ 问题(之前肯定已经问过这个问题,但是有几个粗略的搜索什么都没出现……)
我正在使用(大型)实时流式点云,并且有一个案例我需要从多个传感器获取 2/3/4 点云并将它们粘在一起以创建一个大点云。我的情况是,我确实需要一个结构中的所有数据,而通常当人们只是将点云可视化时,他们可以将它们分别输入查看器中。
我使用的是 Point Cloud Library 1.6,仔细观察它的PointCloud 类(<pcl/point_cloud.h>
如果你感兴趣的话)将所有数据点存储在一个 STL 向量中。
现在我们回到了香草 CS 领域......
PointCloud 有一个 += 运算符,用于将一个点云的内容添加到另一个点云。到目前为止,一切都很好。但是这种方法效率很低 - 如果我理解正确,它 1) 调整目标向量的大小,然后 2) 遍历另一个向量中的所有点,并将它们复制过来。
在我看来,这就像 O(n) 时间复杂度的情况,这通常可能不会太糟糕,但在实时处理每个云至少 300K 点时是个坏消息。
向量不需要排序或分析,它们只需要在内存级别“粘在一起”,所以程序知道一旦它到达第一个向量的末尾,它只需要跳转到起始位置第二个。换句话说,我正在寻找一种 O(1) 向量合并方法。在 STL 中有没有办法做到这一点?还是它更像是 std::list#splice 之类的领域?
注意:本课程是 PCL 的基础部分,因此“非侵入性手术”更为可取。如果需要对类本身进行更改(例如从向量更改为列表,或保留内存),则必须根据对 PCL 其余部分的连锁效应来考虑它们,这可能会影响深远。
更新:我已经在 PCL 的 GitHub 存储库中提交了一个问题,以便与库作者就以下建议进行讨论。一旦就采用哪种方法达成某种解决方案,我将接受相关建议作为答案。