无序集合unordered_set
是C++标准模板库(STL)中的一个关联容器,用于存储唯一的元素,并以哈希表为底层实现。它与set
的主要区别在于元素的存储顺序:unordered_set
是无序的,依赖于哈希表来快速查找、插入和删除元素。
无序集合unordered_set
的几个性质:
- 无序性:元素按照哈希表的方式存储,而不是按照插入顺序或大小顺序;迭代遍历时,元素输出顺序是不确定的。
- 唯一性:
unordered_set
中不允许有重复的元素。如果尝试插入已经存在的元素,新插入的操作将无效,且原来的元素不会被更改。 - 高效性:查找、插入、删除的平均时间复杂度是
O(1)
,但是在最坏的情况下(严重哈希冲突),时间复杂度会达到O(n)
。 - 元素不可改:插入的元素不能在集合中修改,如果想修改得先删除再插入新元素。
常用方法
-
size()
和empty()
:用于获取大小和集合是否为空 -
insert()
和erase()
:用于插入和删除元素 -
find()
:用于查找值(unordered_set
中的元素既是值也是键,有别于unordered_map
)
测试用例
#include <iostream>
#include <unordered_set>
using namespace std;
int main(int argc, char const *argv[])
{
unordered_set<string> stringset;
// 插入元素
stringset.insert("this");
stringset.insert("is");
stringset.insert("a");
stringset.insert("C++");
stringset.insert("demo");
// 判断集合是否为空
if (stringset.empty())
{
cout << "无序集合为空" << endl;
return -1;
}
else // 不为空则输出集合大小
{
cout << "集合的大小是:" << stringset.size() << endl;
}
// 查找
if (stringset.find("C+") != stringset.end())
{
cout << "找到了对应的元素" << endl;
}
else
{
cout << "没有找到对应的元素" << endl;
}
stringset.insert("demo"); // 无法重复插入
stringset.insert("demo1"); // 成功插入
cout << "集合的大小是:" << stringset.size() << endl;
// 遍历元素
unordered_set<string>::iterator itr;
for (itr = stringset.begin(); itr != stringset.end(); itr++)
{
cout << (*itr) << " ";
}
cout << endl;
return 0;
}