有效删除 C++ STL 向量中的双项?

Tho*_* W. 0 c++ algorithm boost stl

可能的重复:
C++ 删除向量中的重复条目

我需要删除 C++ STL 向量中的双项。重要的一点是,结果向量中元素的顺序必须等于输入向量中的顺序。是否有一种算法(例如在 stl、boost 中)可以做到这一点?

Jon*_*Jon 5

这里有两种可能的情况:向量要么已经排序,要么没有排序。

如果是,std::erase并且std::unique可以轻松解决此问题,如其他答案所示。

如果不是那么你可以通过以下方式实现目标

v.erase(std::remove_if(v.begin(), v.end(), predicate), v.end());
Run Code Online (Sandbox Code Playgroud)

但有一个问题,predicate指定起来并不简单:它是一个接受一个参数(要考虑的值)的函数,并且需要回答“向量中前面是否有任何相等的值?”这一问题。由于没有告诉您所提供的参数在向量中的确切位置,这意味着您必须保留相当多的手动状态才能回答这个问题。

这里一个方便的选择是使用 anstd::set来完成一些繁重的工作:

std::set<decltype(v)::value_type> set(v.begin(), v.end());
v.erase(
    std::remove_if(
        v.begin(), 
        v.end(), 
        [&set] (decltype(v)::value_type item) { return !set.erase(item); }), 
    v.end());
Run Code Online (Sandbox Code Playgroud)

其作用是std::set用向量中的值预先填充 an ,然后通过查看某个项目是否已从集合中删除来检查之前是否已见过该项目。这样,结果将仅保留输入中比较相等的每组项目中的第一项。

看看它的实际效果