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