📜  C++ STL 中的 set 与 unordered_set(1)

📅  最后修改于: 2023-12-03 14:39:50.455000             🧑  作者: Mango

C++ STL 中的 set 与 unordered_set

在 C++ STL(标准模板库)中,set 与 unordered_set 都是用来存储一组数据的容器。二者最大的区别在于数据的存储方式不同,set 是使用红黑树实现的,而 unordered_set 是使用哈希表实现的。由于哈希表的实现方式比红黑树要高效,因此 unordered_set 在某些场景下会比 set 更快速。

set
特点
  • 内部自动维护数据的有序性(默认为升序)。
  • 不允许重复的元素存在,相同的元素只会保留一个。
常用操作

插入元素

可以使用 insert 方法向 set 中插入元素:

#include <set>

std::set<int> mySet;
mySet.insert(3);
mySet.insert(1);
mySet.insert(4);

此时 mySet 包含的元素为 {1, 3, 4}。

删除元素

可以使用 erase 方法来删除 set 中的元素:

mySet.erase(3);

此时 mySet 包含的元素为 {1, 4}。

查找元素

可以使用 find 方法来查找 set 中是否包含某个元素:

if (mySet.find(4) != mySet.end()) {
    std::cout << "Element 4 found in set" << std::endl;
}

遍历元素

可以使用迭代器来遍历 set 中的元素:

for (auto it = mySet.begin(); it != mySet.end(); ++it) {
    std::cout << *it << " ";
}

输出为:

1 4
unordered_set
特点
  • 不维护元素的有序性。
  • 允许重复的元素存在。
常用操作

插入元素

可以使用 insert 方法向 unordered_set 中插入元素:

#include <unordered_set>

std::unordered_set<int> mySet;
mySet.insert(3);
mySet.insert(1);
mySet.insert(4);
mySet.insert(3);  // 重复元素会被忽略

此时 mySet 包含的元素为 {1, 3, 4}。

删除元素

可以使用 erase 方法来删除 unordered_set 中的元素:

mySet.erase(3);

此时 mySet 包含的元素为 {1, 4}。

查找元素

可以使用 find 方法来查找 unordered_set 中是否包含某个元素:

if (mySet.find(4) != mySet.end()) {
    std::cout << "Element 4 found in unordered_set" << std::endl;
}

遍历元素

可以使用迭代器来遍历 unordered_set 中的元素:

for (auto it = mySet.begin(); it != mySet.end(); ++it) {
    std::cout << *it << " ";
}

输出为:

1 4
总结

set 与 unordered_set 都可以存储一组数据,但使用场景不同。如果需要按照某种规则对数据进行排序并且不允许重复元素存在,则使用 set;否则,使用 unordered_set 更为便捷。需要注意的是,unordered_set 的查找、插入和删除操作的时间复杂度均为 O(1),而 set 的时间复杂度则是 O(log n),因此在某些场景下 unordered_set 可能会更快速一些。