c++,自己实现的唯一的用于排序向量的指针
C++, own implementation of unique for sorted vector of pointers
如何编写std::惟一的指针排序向量的实现,以便:
a)避免内存泄漏(稳定),b)对于大数据集,越快越好。
比较两个相邻的索引为[i], [i-1]的项,然后调用item[i]的析构函数并从vector中擦除,最简单的变体看起来非常慢。
我能问一下这个问题的可能解决方案吗?示例代码将是有帮助的:-)。谢谢。
我试着用下面的功能写我自己的实现。这里有两个指标。第一个索引表示vector中最后一个唯一元素,第二个索引是公共索引。
我正在逐个元素处理数组元素并交换元素,以便非唯一元素保留在向量的末尾。在我看来,这种一次性擦除k个元素的方法比重复删除一个元素要快…
然后删除位于第一个索引右边的所有元素…
这不是家庭作业,这是一个严肃的问题。我需要从点云中删除重复的元素(1e9points)…与其滚动自己的唯一算法实现,为什么不考虑使用Boost指针容器之一呢?这些容器被设计为存储指向对象的指针而不是对象本身,并自动封装处理所有资源回收所需的逻辑。使用其中一个容器,您可以轻松地使用标准唯一算法。
如果你真的想推出你自己的独特算法版本,我认为你有两个指针的想法是正确的,一个用于读取,一个用于写入。该算法的高级草图是这样工作的:从索引0处开始读和写指针。然后,重复执行以下步骤:
- 查看读指针所指向的值,并创建一个新的临时指针来指向它。
- 读指针向前移动
- 当读指针下的元素与记忆值相同时,将读指针向前移动。
- (此时,读指针下的元素是第一个不等于当前值的值)
- 将写指针下的元素与指向唯一元素的临时指针所指向的值交换。
- 写指针向前移动
该算法以写指针指向所有唯一值之后的第一个值而终止。它不会丢失任何指针,因为元素只是重新排序,而不是销毁。因此,当您完成后,您可以从写指针迭代到数组的末尾,释放您找到的每个指针。这在O(n)时间内运行,这是渐进最优的。
希望这对你有帮助!
相关文章:
- 计算排序向量的向量中唯一值的计数
- 查找两个排序向量中共有的元素
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 如何从C++的对的排序向量中获取有关给定值的相应对
- 对象接收堆栈溢出异常 c++ 的排序向量
- "x"的所有元素都存在于"y"(排序向量)中吗?
- 指向指针排序向量的指针向量的 C++ 向量
- 未排序向量上的lower_bound/upper_bound
- 智能指针的排序向量:神秘崩溃
- 按类型排序向量并按类型或派生类型搜索
- 如何在不使用标准算法的情况下在排序向量中添加 c 元素?
- C++排序向量<double>与在<Object>双成员变量上键控的向量
- 字符串指针的排序向量
- 具有前导数字的字符串的排序向量
- 保证重新排序向量
- 结构解释的C 排序向量
- 更新排序向量的一个条目
- 通过在排序向量上使用二叉搜索来定位未排序向量中的元素
- 排序向量上 std::find_if 和 std::bind2nd 的替代品
- 使用QuickSort算法以降序排序向量