📅  最后修改于: 2023-12-03 15:21:30.720000             🧑  作者: Mango
在 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::set
和 std::unordered_set
的使用和比较。在选择 std::set
和 std::unordered_set
时,需要根据实际情况考虑各种因素,如有序性、时间复杂度、元素数量等。