卡码网语言基础课 |判断集合成员

卡码网语言基础课 |判断集合成员

前言

哈希表的主要作用是判断给定的整数是否存在于给定的数据中,哈希表常使用的数据结构有数组、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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值