1. 定义
unordered_set<> 容器类型的模板定义在 unordered_set 头文件中。unordered_set<> 容器提供了和 unordered_map<> 相似的能力,但 unordered_set<> 可以用保存的元素作为它们自己的键。其中保存类型的对象在容器中的位置由它们的哈希值决定,因而需要定义一个 Hash<> 函数。
这种容器不能存放重复的元素。元素类型必须可以比较是否相等,因为这可以确定元素什么时候相等。就像 uordered_map,元素被存放在哈希表内部的格子中。每个格子保存哪个元素,是由元素的哈希值决定的。unordered_set 容器组织方式的概念图如图 1 所示:
如果所计算出的哈希值冲突,则根据一些规则重新分配位置
2. 基本用法
构造方法,插入元素,查找元素,基本信息。删除元素
# include<iostream>
# include<unordered_set>
# include<vector>
using namespace std;
int main(){
unordered_set <string> example{"aaa", "ccc"};
for (auto element : example){
cout << element << " " << endl;
} // 桶排序输出
// 插入元素 (由于整个数据结构基于哈希构建,无法插入相同元素)
cout << "--------------- insert element ---------------" << endl;
example.insert("ddd");
for (auto element : example){
cout << element << " " << endl;
}
cout << " --- --- ---" << endl;
vector <string> inserList{"www", "eee"};
example.insert(inserList.begin(), inserList.end());
for (auto element : example){
cout << element << " " << endl;
}
// 查找元素 .find() .count()
// find可以理解为查找具体元素,返回元素的位置结果
// count可以理解为查找具体元素是否在数据结构中,返回的结果为0/1
cout << "--------------- find element ---------------" << endl;
if((example.find("www")) != example.end()){
cout << "www in unordered_set exampe" << endl;;
}
else{
cout << "www not in unordered_set example" << endl;
}
cout << " --- --- ---" << endl;
if((example.count("www")) != 0){
cout << "www in unordered_set exampe" << endl;;
}
else{
cout << "www not in unordered_set example" << endl;
}
// unordered_set 的常用信息
// .size() .max_size() .empty()
cout << "--------------- basic information ---------------" << endl;
cout << "example size: " << example.size() << endl;
cout << "example max_size: " << example.max_size() << endl;
cout << "example empty or not: " << example.empty() << endl;
// 删除 unordered_set 中的元素 .clear() .erase()
// .clear() 全部清除
// .erase() 清楚指定元素
cout << "--------------- delete element ---------------" << endl;
example.erase("www");
for (auto element : example){
cout << element << " " << endl;
}
unordered_set<string> delete_example = example;
delete_example.clear();
cout << "delete_example is empty: " << delete_example.empty() << endl;
}