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

一、读题

// k 组测试数据。 m表示集合中元素的数量;n表示要找的数
// 2组测试数据(k)
// 5个元素(m)
// 第一组数据“1 2 3 4 5”
// 要找的数3(n)
// 6个元素(m)
// 第二组数据“1 2 3 4 5 6”
// 要找的数7(n)

二、知识点

set集合, 具体包括下列内容:

    set、unordered_set, multiset 的概念和特点
    set、unordered_set, multiset 的基本操作,比如创建、插入、删除、查找
    迭代器iterator

(一)set、multiset、unordered_set的区别:

1)set(集合)用于允许存储一组不重复的元素,并且元素的值按照有序排列,set基于红黑树实现,支持高效的关键字查询操作,可以用来检查一个给定关键字是否在set中。

2)multiset 则是一个用于存储一组元素,允许元素重复,并按照元素的值进行有序排列的集合。

3)unordered-set(无序集合)类似于集合(Set),用于允许存储一组不重复的元素,但不会按照元素的值进行排序,而是由哈希函数的结果决定的。

(二)set的使用

1、使用集合set需要先引入头文件

2、创建一个集合

3、向集合中插入元素

4、往集合中删除元素

// 引入<unordered_set>头文件
#include <unordered_set>
// 引入set头文件
#include <set>

// 创建一个存储整数的无序集合
unordered_set<int> mySet;
// 创建一个存储整数的set
set<int> mySet;
// 创建一个存储整数的 multiset
multiset<int> myMultiSet; 

// 向集合中插入元素
mySet.insert(1);
mySet.insert(2);
mySet.insert(3);

// 往集合中删除元素
mySet.erase(1);

5、找特定元素是否存在于集合中

如果 find() 方法找到了要查找的元素,它会返回指向该元素的迭代器;

如果未找到要查找的元素,它会返回一个指向集合的 end() 的迭代器,表示未找到。

通过比较find()方法返回的迭代器是否等于 end(),可以确定集合中是否有查找的元素。

if (mySet.find(i) != mySet.end()) 
{
    // 判断元素是否在集合中, 只要不等于end(), 说明元素在集合中
}

(三)迭代器

迭代器iterator提供了一种类似指针的接口,可以用来遍历访问容器(比如数组、集合)中的元素,并执行各种操作。

可以理解为,迭代器和下标运算符的作用一样,用来访问容器中的元素,并且迭代器可以从一个元素移动到另外一个元素。

1、迭代器都拥有名为begin()和end()的成员

        begin()表示指向第一个元素的下一个元素的迭代器,

        end()表示最后一个元素的下一个元素的迭代器(尾后迭代器),

        如果容器为空,则begin和end返回的是同一个迭代器。

2、可以使用比较运算符判断两个迭代器是否相等

3、如果迭代器想要从一个元素移动到另外一个元素,可以使用递增++运算符和递减--运算符,表示向前(后)移动一个位置。

4、通过解引用*可以获取迭代器所指的对象。

例如:遍历vector

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> MyVec = {1, 2, 3, 4, 5};

    // 用于创建一个能读取<vector>int 元素的迭代器it,最初指向begin()
    // ++it表示迭代器的移动
    for(vector<int>::iterator it = MyVec.begin(); it != MyVec.end(); ++it)
    {
        cout << *it <<" ";
    }

    cout << endl;

    return 0;
}

三、代码

#include <iostream>
#include <set>

using namespace std;

int main()
{
    // 测试数据组数
    int k;
    // 元素的数量
    int m;
    // 要找的数
    int n;
    // 元素的值
    int val;
    cin >> k;
    // 遍历每组数据
    while (k--)
    {
        cin >> m;
        set<int> MySet;
        // 将数据放进MySet中
        while (m--)
        {
            cin >> val;
            MySet.insert(val);
        }
        cin >> n;
        // 查询n是否在MySet里
        if (MySet.find(n) != MySet.end()) cout << "YES" <<endl;
        else cout << "NO" << endl;
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值