📜  从向量 C++ 中删除重复项(1)

📅  最后修改于: 2023-12-03 15:06:34.374000             🧑  作者: Mango

从向量中删除重复项

在 C++ 中,我们经常需要处理向量中的数据,如果向量中有重复项,可能会影响程序的正确性。因此需要在向量中删除重复项。本文将介绍如何在 C++ 中删除向量中的重复项。

方法一:使用 STL 中的 unique() 函数

在 C++ 的 STL 标准库中,有一个名为 unique() 的函数,可以用于删除向量中的重复项。具体使用如下:

#include <algorithm>
#include <vector>
using namespace std;

int main() {
    vector<int> vec = {1, 2, 2, 3, 3, 3, 4};

    auto last = unique(vec.begin(), vec.end());

    vec.erase(last, vec.end());

    return 0;
}

在上述代码中,unique() 函数会将向量中的重复项移到向量尾部,返回值是一个迭代器,它指向最后一个不重复的元素的下一个位置。因此,我们可以通过 erase() 函数来删除重复项。erase() 函数需要两个参数,第一个参数为删除的开始位置,第二个参数为删除的结束位置。

方法二:使用哈希表

除了使用 STL 的 unique() 函数,我们还可以使用哈希表来删除向量的重复项。具体实现如下:

#include <unordered_set>
#include <vector>
using namespace std;

int main() {
    vector<int> vec = {1, 2, 2, 3, 3, 3, 4};
    unordered_set<int> hashset;
    vector<int> result;

    for (int i = 0; i < vec.size(); i++) {
        if (hashset.insert(vec[i]).second) {
            result.push_back(vec[i]);
        }
    }

    return 0;
}

在上述代码中,我们使用哈希表 unordered_set 来存储向量中的元素,如果元素已经存在于哈希表中,就说明是重复项,不需要添加到结果向量中。如果元素不存在于哈希表中,就将其添加到哈希表中,并添加到结果向量中。

性能比较

两种方法的时间复杂度均为 O(n),其中哈希表的常数因子较大,因此在小规模数据下,使用 unique() 函数会更快。但是在大规模数据下,哈希表的性能优势更加显著。

因此,选择哪个方法可以根据实际应用情况和数据规模来决定。

总结

在 C++ 中,删除向量中的重复项是一项常见的任务。本文介绍了使用 STL 的 unique() 函数和哈希表来实现该功能的方法,并进行了性能比较。通过了解这些方法,我们可以根据实际情况选择适合的方法来优化程序性能。