c++,自己实现的唯一的用于排序向量的指针

C++, own implementation of unique for sorted vector of pointers

本文关键字:排序 向量 指针 用于 唯一 自己 实现 c++      更新时间:2023-10-16

如何编写std::惟一的指针排序向量的实现,以便:

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

b)对于大数据集,越快越好。

比较两个相邻的索引为[i], [i-1]的项,然后调用item[i]的析构函数并从vector中擦除,最简单的变体看起来非常慢。

我能问一下这个问题的可能解决方案吗?示例代码将是有帮助的:-)。谢谢。

我试着用下面的功能写我自己的实现。这里有两个指标。第一个索引表示vector中最后一个唯一元素,第二个索引是公共索引。

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

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

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

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

如果你真的想推出你自己的独特算法版本,我认为你有两个指针的想法是正确的,一个用于读取,一个用于写入。该算法的高级草图是这样工作的:从索引0处开始读和写指针。然后,重复执行以下步骤:

  1. 查看读指针所指向的值,并创建一个新的临时指针来指向它。
  2. 读指针向前移动
  3. 当读指针下的元素与记忆值相同时,将读指针向前移动。
  4. (此时,读指针下的元素是第一个不等于当前值的值)
  5. 将写指针下的元素与指向唯一元素的临时指针所指向的值交换。
  6. 写指针向前移动

该算法以写指针指向所有唯一值之后的第一个值而终止。它不会丢失任何指针,因为元素只是重新排序,而不是销毁。因此,当您完成后,您可以从写指针迭代到数组的末尾,释放您找到的每个指针。这在O(n)时间内运行,这是渐进最优的。

希望这对你有帮助!