📜  不允许重复的列表 c++ (1)

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

不允许重复的列表 C++

简介

在 C++ 中,有时候我们需要创建一个不允许重复的列表。这种列表也被称为集合(Set)。集合在实际的开发中非常常见,可以用于去重、排序等操作。本文介绍了在 C++ 中创建不允许重复的列表的方法,以及它们的使用和比较。

std::set

在 C++ 中,可以使用标准模板库(STL)中的 std::set 创建不允许重复的列表。std::set 使用红黑树实现,因此其插入、查找等操作的时间复杂度都为 $O(logn)$。以下是一个简单的示例:

#include <set>
#include <iostream>

int main() {
    std::set<int> myset;
    myset.insert(1);
    myset.insert(2);
    myset.insert(1); // 不会再次插入 1

    for (auto it = myset.begin(); it != myset.end(); ++it) {
        std::cout << *it << " "; // 输出 1 2
    }

    return 0;
}

在上面的示例中,我们使用 std::set 创建了一个不允许重复的列表 myset,并向其中插入了 1、2、1 三个元素。由于 std::set 不允许重复,因此第三次插入 1 时不会对列表造成影响。最后我们使用迭代器遍历整个列表并输出其中的元素。

std::unordered_set

除了 std::set,C++ 还提供了 std::unordered_set,用于创建不允许重复的无序列表。std::unordered_set 使用哈希表实现,因此其插入、查找等操作的时间复杂度都为 $O(1)$。以下是一个简单的示例:

#include <unordered_set>
#include <iostream>

int main() {
    std::unordered_set<int> myset;
    myset.insert(1);
    myset.insert(2);
    myset.insert(1); // 不会再次插入 1

    for (auto it = myset.begin(); it != myset.end(); ++it) {
        std::cout << *it << " "; // 输出 1 2
    }

    return 0;
}

在上面的示例中,我们使用 std::unordered_set 创建了一个不允许重复的无序列表 myset,并向其中插入了 1、2、1 三个元素。由于 std::unordered_set 不允许重复,因此第三次插入 1 时不会对列表造成影响。最后我们使用迭代器遍历整个列表并输出其中的元素。

选择哪一个

对于不允许重复的列表,我们可以选择使用 std::set 还是 std::unordered_set 呢?以下是一些考虑因素:

  • 如果需要保证元素的有序性,建议使用 std::set。如果不需要保证有序性或者需要更快的插入、查找等操作,建议使用 std::unordered_set
  • std::set 的插入、查找等操作的时间复杂度都为 $O(logn)$,而 std::unordered_set 的时间复杂度都为 $O(1)$。因此,如果对时间复杂度有比较高的要求,建议使用 std::unordered_set
  • std::set 的插入、查找等操作需要进行比较操作,而 std::unordered_set 的插入、查找等操作需要进行哈希操作。因此,在元素较少的情况下,std::set 的性能可能会更好,因为比较操作比哈希操作更快。
总结

本文介绍了在 C++ 中创建不允许重复的列表的方法,以及 std::setstd::unordered_set 的使用和比较。在选择 std::setstd::unordered_set 时,需要根据实际情况考虑各种因素,如有序性、时间复杂度、元素数量等。