C ++,自己对指针排序向量的唯一实现

时间:2011-09-10 20:12:48

标签: c++ algorithm vector unique

如何为指针的有序向量编写自己的std :: unique实现,以便:

a)避免内存泄漏(稳定),

b)尽快对大型数据集进行快速处理。

比较2个具有index [i],[i-1]的相邻项目,然后调用item [i]的析构函数并从vector中删除的最简单变体看起来非常慢。

我可以问一下问题的可能解决方案吗?示例代码会有所帮助:-)。感谢。

我尝试使用以下功能编写自己的实现。有两个指数。第一个表示向量中的最后一个唯一元素,第二个索引是公共索引。

我逐个元素处理数组并交换元素,因为非唯一元素保留在向量的末尾。在我看来,这种方法一次性删除k元素比重复删除一个元素更快......

然后删除位于第一个索引右侧的所有元素......

这不是一个家庭作业,这是一个严肃的问题。我需要从点云中删除重复的元素(1e9points)......

1 个答案:

答案 0 :(得分:2)

为什么不考虑使用Boost pointer containers中的一个?而不是滚动自己的独特算法实现?这些容器旨在存储指向对象而不是对象本身的指针,并自动封装处理所有资源回收所需的逻辑。使用其中一个容器,您可以轻松地使用标准的唯一算法。

如果您确实想要推出自己独特算法的版本,我认为您有正确的想法有两个指针,一个用于阅读,另一个用于写作。该算法的高级草图的工作方式如下:在索引零处启动读取和写入指针。然后,重复应用此步骤:

  1. 查看读指针指向的值,并创建一个指向它的新临时指针。
  2. 向前推进读取指针。
  3. 当读指针下的元素与记忆值相同时,向前推进读指针。
  4. (此时,读指针下的元素是第一个不等于当前值的值。)
  5. 将写指针下的元素与指向唯一元素的临时指针指向的值交换。
  6. 向前推进写指针。
  7. 此算法终止,写指针指向超过所有唯一值的第一个值。它不会丢失任何指针,因为元素只是重新排序,而不是被破坏。因此,当你完成后,你可以从写指针迭代到数组的末尾,释放你找到的每个指针。这在O(n)时间内运行,这是渐近最优的。

    希望这有帮助!