gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:38:53 26 4
gpt4 key购买 nike

我有一个整数数组,我需要从中删除重复项,同时保持每个整数第一次出现的顺序。我可以看到这样做,但想象一下有更好的方法可以更好地利用 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/55960230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com