如何为指针的有序向量编写自己的std :: unique实现,以便:
a)避免内存泄漏(稳定),
b)尽快对大型数据集进行快速处理。
比较2个具有index [i],[i-1]的相邻项目,然后调用item [i]的析构函数并从vector中删除的最简单变体看起来非常慢。
我可以问一下问题的可能解决方案吗?示例代码会有所帮助:-)。感谢。
我尝试使用以下功能编写自己的实现。有两个指数。第一个表示向量中的最后一个唯一元素,第二个索引是公共索引。
我逐个元素处理数组并交换元素,因为非唯一元素保留在向量的末尾。在我看来,这种方法一次性删除k元素比重复删除一个元素更快......
然后删除位于第一个索引右侧的所有元素......
这不是一个家庭作业,这是一个严肃的问题。我需要从点云中删除重复的元素(1e9points)......
答案 0 :(得分:2)
为什么不考虑使用Boost pointer containers中的一个?而不是滚动自己的独特算法实现?这些容器旨在存储指向对象而不是对象本身的指针,并自动封装处理所有资源回收所需的逻辑。使用其中一个容器,您可以轻松地使用标准的唯一算法。
如果您确实想要推出自己独特算法的版本,我认为您有正确的想法有两个指针,一个用于阅读,另一个用于写作。该算法的高级草图的工作方式如下:在索引零处启动读取和写入指针。然后,重复应用此步骤:
此算法终止,写指针指向超过所有唯一值的第一个值。它不会丢失任何指针,因为元素只是重新排序,而不是被破坏。因此,当你完成后,你可以从写指针迭代到数组的末尾,释放你找到的每个指针。这在O(n)时间内运行,这是渐近最优的。
希望这有帮助!