前言
哈希表的主要作用是判断给定的整数是否存在于给定的数据中,哈希表常使用的数据结构有数组、set集合、map映射。
set
和数学中的集合一样,C++中的集合set
用于允许存储一组不重复的元素,并且元素的值按照有序排列,set
基于红黑树实现,支持高效的关键字查询操作, 可以用来检查一个给定关键字是否在set
中。
无序集合unordered-set
类似于集合(Set),但不会按照元素的值进行排序,而是由哈希函数的结果决定的。
multiset
则是一个用于存储一组元素,允许元素重复,并按照元素的值进行有序排列的集合。
集合 | 底层实现 | 是否有序 | 数值是否可以重复 |
---|---|---|---|
std::set | 红黑树 | 有序 | 否 |
std::multiset | 红黑树 | 有序 | 否 |
std::unordered_set | 哈希表 | 有序 | 否 |
Set的使用
使用集合set
需要先引入头文件
// 引入unordered_set头文件
#include <unordered_set>
// 引入set头文件
#include <set>
创建一个集合的方法如下:
// 创建一个存储整数的无序集合
unordered_set<int> set
// 创建一个存储整数的set
set<int> mySet
// 创建一个存储整数的 multiset
multiset<int> mySet
想要向集合中插入元素需要使用insert()
方法
mySet.insert(1);
想要从集合中删除元素需要使用erase
方法
mySet.erase(1);
find()
方法用于查找特定元素是否存在于集合中,如果find()
方法找到了要查找的元素,它会返回指向该元素的迭代器,如果未找到要查找的元素,它会返回一个指向集合的end()
的迭代器,表示未找到。通过比较find()
方法返回的迭代器是否等于end()
,可以确定集合中是否有查找的元素。
// 判断元素 i 是否在 set 中,只要不等于end(),说明元素在集合中
if (mySet.find(i) != mySet.end()) {
}
代码实现
首先写出代码的基础结构:
#include <iostream>
#include <unordered_set>
using namespace std;
int main () {
int k, m; // k 组测试数据, m 表示需要集合的数量
cin >> k;
while (k--) {
cin >> m;
}
}
创建一个集合,将输入的数据用insert()
方法插入到集合中
unordered_set<int> uset;
while (n--) {
cin >> val;
uset.insert(val);
}
判断某个元素是否在集合中,需要使用find()
方法,如果找到了,返回指向元素的迭代器,如果不存在,则最终指向end()
的迭代器,通过判断fiind()
的返回结果可以判定元素是否在集合中。
cin >> n;
if (uset.find(n) != uset.end()) {
cout << "YES" << endl;
} esle {
cout << "NO" << endl;
}
完整代码如下:
#include <iostream>
#include <unordered_set>
using namespace std;
int main() {
int k, n, val, m;
cin >> k;
while (k--) {
cin >> n;
unordered_set<int> uset;
while (n--) {
cin >> val;
uset.insert(val);
}
cin >> m;
if (uset.find(m) != uset.end()) cout << "YES" << endl;
else cout << "NO" << endl;
}
}