📅  最后修改于: 2023-12-03 14:59:46.719000             🧑  作者: Mango
在C++中,STL(Standard Template Library)是一组数据结构和算法的实现。set和unordered_set是STL中两种常用的数据结构。它们都是基于哈希表实现的集合容器,但是它们在实现和特性方面有所不同。本文将对这两种容器进行介绍和比较。
set是一种使用红黑树进行实现的有序集合容器。在set中插入元素时,它会自动进行排序,因此它的元素是有序的。由于底层是使用二叉搜索树实现的,因此它具有以下特征:
以下是set容器的简单用法:
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> s;
// 插入元素
s.insert(3);
s.insert(1);
s.insert(5);
// 打印元素
for (auto x : s)
cout << x << " ";
// 输出:1 3 5
// 查找元素
if (s.find(3) != s.end())
cout << "3 is found" << endl;
// 输出:3 is found
// 删除元素
s.erase(3);
// 打印元素
for (auto x : s)
cout << x << " ";
// 输出:1 5
return 0;
}
与set不同,unordered_set是一种使用哈希表进行实现的无序集合容器。在unordered_set中插入元素时,它不会自动进行排序,因此它的元素是无序的。由于底层是使用哈希表实现的,因此它具有以下特征:
以下是unordered_set容器的简单用法:
#include <iostream>
#include <unordered_set>
using namespace std;
int main()
{
unordered_set<int> s;
// 插入元素
s.insert(3);
s.insert(1);
s.insert(5);
// 打印元素
for (auto x : s)
cout << x << " ";
// 输出:1 3 5(与插入顺序无关)
// 查找元素
if (s.find(3) != s.end())
cout << "3 is found" << endl;
// 输出:3 is found
// 删除元素
s.erase(3);
// 打印元素
for (auto x : s)
cout << x << " ";
// 输出:1 5
return 0;
}
set和unordered_set的选择取决于具体的应用场景。如果需要按照某种规则对元素进行排序,或者需要迭代器来访问和修改元素,那么set是一个更好的选择。如果不要求元素有序,需要快速查找元素,则unordered_set是一个更好的选择。
以下是set和unordered_set的比较:
| 功能比较 | set | unordered_set | | ---------- | ---- | ------------- | | 底层实现 | 红黑树 | 哈希表 | | 容器类型 | 有序容器 | 无序容器 | | 元素排序 | 元素有序 | 元素无序 | | 查找速度 | O(logN) | O(1) | | 访问速度 | O(logN) | O(1) | | 插入和删除速度 | O(logN) | O(1) | | 内存占用 | 比unordered_set大 | 比set小 | | 插入时重复元素处理 | 自动忽略 | 自动忽略 | | 元素访问和修改 | 需要使用迭代器 | 不需要使用迭代器 |
在C++ STL中,set和unordered_set都是常用的集合容器。它们都基于哈希表实现,但在元素的排序、查找速度、访问和修改、内存占用等方面有所不同。在选择使用哪种容器时,需要根据具体的应用场景进行选择。