在恒定的O(1)时间内连接2个STL向量

use*_*135 1 c++ stl point-cloud-library

我将给出一些关于我为什么要这样做的背景,但最终可以忽略上下文,因为它主要是经典的计算机科学和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回购中提出了一个问题,以便与图书馆作者就下面的建议进行讨论.一旦有某种解决办法,我会接受相关的建议作为答案.

Dav*_*eas 8

向量不是列表,它表示序列,但附加要求元素必须存储在连续的内存中.您不能将两个向量(其缓冲区不连续)捆绑到一个向量中而不移动对象.


Zan*_*ynx 6

这个问题在使用String Rope类之前已经解决了很多次.

基本方法是创建一个存储指向点云的指针的新容器类型.这就像std :: deque,除了你的将拥有可变大小的块.除非你的云块变成标​​准尺寸?

使用这个新容器,迭代器从第一个块开始,一直到最后然后移动到下一个块.在具有可变大小的块的这种容器中进行随机访问需要二进制搜索.实际上,这样的数据结构可以写成B +树的扭曲形式.


Use*_*ess 5

没有矢量等价的拼接 - 没有,特别是因为内存布局要求,这可能是它首先被选中的原因.

也没有连接向量的恒定时间方法.

我可以想到一种(脆弱的)方法在常量时间内连接原始数组,但它依赖于它们在开始和结束时在页面边界上对齐,然后将它们重新映射为相邻.这很难概括.

还有另一种方法可以创建一个看起来像连接向量的东西,这是一个包装器容器,它像一个deque一样工作,并提供一个统一的迭代器和operator[]它们.我不知道点云库是否足够灵活,可以使用它.(Jamin的建议主要是使用类似这样的东西而不是矢量,Zan的大致是我的想法).