在重复删除中保持顺序: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中文网其他相关文章!