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

目录

一、 set 集合

二、 创建集合

2.1 引入头文件

2.2 创建 

2.3 插入元素

2.4 删除元素

三、 find的用法

四、 实现基本解题

五、 延伸拓展


题目:编写一个程序,判断给定的整数 n 是否存在于给定的集合中。

输入描述:

有多组测试数据,第一行有一个整数 k,代表有 k 组测试数据。

每组数据第一行首先是一个正整数 m,表示集合中元素的数量(1 <= m <= 1000)。 

接下来一行包含 m 个整数,表示集合中的元素。 

最后一行包含一个整数 n,表示需要进行判断的目标整数。

输出描述:

包含多组输出,每组输出占一行。 如果集合中存在 m,输出“YES”,否则输出“NO”。

一、 set 集合

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

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

无序集合unordered-set类似于集合(Set),但不会按照元素的值进行排序,而是由哈希函数的结果决定的。

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

二、 创建集合

2.1 引入头文件

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

2.2 创建 

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

//创建一个储存整数的set
set<int> mySet;

//创建一个储存整数的multiset
multiset<int> myMultiSet;

2.3 插入元素

向集合中插入元素需要使用insert()方法

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

2.4 删除元素

往集合中删除元素需要使用erase方法

mySet.erase(1);

三、 find的用法

find() 方法用于查找特定元素是否存在于集合中,如果 find() 方法找到了要查找的元素,它会返回指向该元素的迭代器,如果未找到要查找的元素,它会返回一个指向集合的 end() 的迭代器,表示未找到。通过比较find()方法返回的迭代器是否等于 end(),可以确定集合中是否有查找的元素。

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

四、 实现基本解题

#include <iostream>

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

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


using namespace std;
int main(){
    int k, n, val, m;
    cin >> k;
    while(k--){
        cin >> n;
        unordered_set<int> mySet; //创建一个储存整数的无序集合
        while(n--){
            cin >> val;
            //使用insert方法将数据放进set中
            mySet.insert(val);
        }
        cin >> m;
        
        //使用find()方法查询m是否在set里面
        if(mySet.find(m) != mySet.end()) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
  
}

五、 延伸拓展

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

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

迭代器都拥有名为begin()end()的成员,表示指向第一个元素和最后一个元素的下一个元素的迭代器(尾后迭代器),如果容器为空,则beginend返回的是同一个迭代器。

可以使用比较运算符来判断两个迭代器是否相等,如果迭代器想要从一个元素移动到另外一个元素,可以使用递增++运算符和递减--运算符,表示向前(后)移动一个位置。

通过解引用*可以获取迭代器所指的对象,下面的示例表示了vector的遍历。

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

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

    // 使用迭代器遍历容器
      // vector<int>::iterator it  用于创建一个能读取<vector>int 元素的迭代器it,最初指向begin()
      // ++it表示迭代器的移动
    for (vector<int>::iterator it = myVector.begin(); it != myVector.end(); ++it) {
        cout << *it << " "; // 通过解引用获取迭代器所指的对象
    }

    cout << endl; 

    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值