c++ - 如何在使用算法保持原始排序的同时从未排序的 std::vector 中删除重复项?

标签 c++ duplicates stdvector stl-algorithm stdset

我有一个整数数组,我需要从中删除重复项,同时保持每个整数第一次出现的顺序。我可以看到这样做,但想象有更好的方法可以更好地利用 STL 算法?插入超出了我的控制范围,因此我无法在插入之前检查重复项。

int unsortedRemoveDuplicates(std::vector<int> &numbers) {
    std::set<int> uniqueNumbers;
    std::vector<int>::iterator allItr = numbers.begin();
    std::vector<int>::iterator unique = allItr;
    std::vector<int>::iterator endItr = numbers.end();

    for (; allItr != endItr; ++allItr) {
        const bool isUnique = uniqueNumbers.insert(*allItr).second;

        if (isUnique) {
            *unique = *allItr;
            ++unique;
        }
    }

    const int duplicates = endItr - unique;

    numbers.erase(unique, endItr);
    return duplicates;
}

如何使用 STL 算法做到这一点?

最佳答案

听起来像是 std::copy_if 的工作.定义一个谓词来跟踪已经处理过的元素,如果有则返回 false。

如果你没有 C++11 支持,你可以使用笨拙的名字 std::remove_copy_if并反转逻辑。

这是一个未经测试的例子:

template <typename T>
struct NotDuplicate {
  bool operator()(const T& element) {
    return s_.insert(element).second; // true if s_.insert(element);
  }
 private:
  std::set<T> s_;
};

然后

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

其中 std::ref 已用于避免算法在内部复制有状态仿函数的潜在问题,尽管 std::copy_if 没有放置任何对所应用的仿函数的副作用的要求。

关于c++ - 如何在使用算法保持原始排序的同时从未排序的 std::vector 中删除重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12200486/

相关文章:

c++ - QML 动态组合框条目

c++ - unique_ptr 删除的 vector ?

c++ - 为什么 .push_back(x) 比 .push_back(std::move(x)) 快

c++ - 使用共享库的 MySql UDF 不会加载

c++ - 从哪里开始使用 C++ 进行多线程编程?

c++ - 在 std::move() 之后删除堆上的结构成员

java - 如何修复 android studio 的所有/大多数依赖错误

arrays - 查找并删除自定义数组类型中的重复项

duplicates - 链接器命令失败,退出代码 1 : duplicate symbol

c++ - 将对象存储在 std::vector 中会增加对象的生命周期吗?