c++ - 在恒定的 O(1) 时间内连接 2 个 STL vector

标签 c++ stl point-cloud-library

我会给出一些关于为什么我要尝试这样做的上下文,但最终可以忽略上下文,因为它主要是一个经典的计算机科学和 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/

相关文章:

c++ - 使用步幅获取 std::vector 的最大元素

c++ - 在 C++ 映射中添加动态条目

c++ - 在 PCL 中从无组织的点云生成图像

c++ - 确定cin中给出了多少个字符?

c++ - 为什么这个未打开的 ifstream 在我尝试从中提取后仍然是 "good"?

c++ - 指向成员函数的指针 - 不想工作

c++ - pcl::PCLPointCloud2 用法

c++ - 使用文件流时,如何使程序无论用户的密码如何都可以运行?

c++ - STL 中的自由函数是否需要 namespace ?

c++ - 使用键盘回调事件保存屏幕截图