首页 > 后端开发 > C++ > 正文

如何从未排序的向量中删除重复项,同时保留 C 中的顺序?

Mary-Kate Olsen
发布: 2024-11-14 09:44:02
原创
377 人浏览过

How to Remove Duplicates from an Unsorted Vector while Preserving Order in C  ?

在重复删除中保持顺序:STL 算法来救援

处理未排序的向量时,删除重复项同时保留向量的任务原始订购可能会令人望而生畏。虽然像使用集合来跟踪唯一元素这样的强力方法是可行的,但让我们探索利用 STL 算法的更优雅的解决方案。

STL 中一个强大的算法是 std::copy_if。它需要一个谓词来过滤元素,将那些符合条件的元素复制到新容器中。为了在这里应用它,我们定义了一个 NotDuplicate 谓词,它维护一组已处理的元素,并且如果之前遇到过某个元素,则计算结果为 false。

这是 的简化实现NotDuplicate 谓词:

struct NotDuplicate {
  bool operator()(const int& element) {
    return s_.insert(element).second;
  }
 private:
  std::set<int> s_;
};
登录后复制

有了这个谓词,我们可以使用std::copy_if 来实现我们的目标:

std::vector<int> uniqueNumbers;
NotDuplicate<int> pred;
std::copy_if(numbers.begin(), numbers.end(), 
             std::back_inserter(uniqueNumbers),
             std::ref(pred));
登录后复制

此代码迭代原始向量,使用 NotDuplicate 谓词过滤元素。以前没有遇到过的元素将被复制到 uniqueNumbers 向量,保留原始顺序。

对于那些没有 C 11 支持的,另一种方法是 std::remove_copy_if,其作用相反std::copy_if。您可以反转谓词的逻辑(例如,如果遇到元素,则返回 true)并使用 std::remove_copy_if 删除重复项:

std::vector<int> uniqueNumbers;
NotDuplicate<int> pred;
std::remove_copy_if(numbers.begin(), numbers.end(), 
             std::back_inserter(uniqueNumbers),
             std::ref(pred));
登录后复制

此解决方案提供了高效的利用 STL 算法的多功能性,在保持原始顺序的同时删除重复项的优雅方式。

以上是如何从未排序的向量中删除重复项,同时保留 C 中的顺序?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板