目录
前言
仅个人记录所用
源自卡码网的C++基础课
“这门C++基础课 帮助 编程零基础学员快速学习刷算法题所需要的基础语法知识,学完之后,再来刷代码随想录,或者自己去刷编程题,基本不会有语法方面的困惑了,可以帮助大家快速上手刷题。 ”
第十七题包含以下内容:
set
、``unordered_set,
multiset `的概念和特点set
、``unordered_set,
multiset`的创建、插入、删除、查找等基本操作- 迭代器
iterator
- 使用迭代器遍历容器
一、题目描述
题目描述
请你编写一个程序,判断给定的整数 n 是否存在于给定的集合中。
输入描述
有多组测试数据,第一行有一个整数 k,代表有 k 组测试数据。
每组数据第一行首先是一个正整数 m,表示集合中元素的数量(1 <= m <= 1000)。
接下来一行包含 m 个整数,表示集合中的元素。
最后一行包含一个整数 n,表示需要进行判断的目标整数。
输出描述
包含多组输出,每组输出占一行。
如果集合中存在 m,输出“YES”,否则输出“NO”。
输入示例
2
5
1 2 3 4 5
3
6
1 2 3 4 5 6
7
输出示例
YES
NO
二、解题思路
哈希表的主要作用是判断给定的整数是否存在于给定的数据中, 哈希表常使用的数据结构有数组、set集合
、map映射
, 上节课我们学习了数组作为哈希表,这节课我们来学习set
集合, 具体包括下列内容
set
、``unordered_set,
multiset `的概念和特点set
、``unordered_set,
multiset `的基本操作,比如创建、插入、删除、查找- 迭代器
iterator
1.Set
和数学中的集合一样,C++中的集合set
用于允许存储一组不重复的元素, 并且元素的值按照有序排列, set
基于红黑树实现,支持高效的关键字查询操作, 可以用来检查一个给定关键字是否在set
中。
无序集合unordered-set
类似于集合(Set),但不会按照元素的值进行排序,而是由哈希函数的结果决定的。
multiset
则是一个用于存储一组元素,允许元素重复,并按照元素的值进行有序排列的集合。
集合 | 底层实现 | 是否有序 | 数值是否可以重复 |
---|---|---|---|
std::set | 红黑树 | 有序 | 否 |
std::multiset | 红黑树 | 有序 | 是 |
std::unordered_set | 哈希表 | 无序 | 否 |
2.Set的使用
使用集合set
需要先引入头文件
// 引入<unordered_set>头文件
#include <unordered_set>
// 引入set头文件
#include <set>
创建一个集合的写法如下
// 创建一个存储整数的无序集合
unordered_set<int> mySet;
// 创建一个存储整数的set
set<int> mySet;
// 创建一个存储整数的 multiset
multiset<int> myMultiSet;
想要向集合中插入元素需要使用insert()
方法
// 向集合中插入元素
mySet.insert(1);
mySet.insert(2);
mySet.insert(3);
想要往集合中删除元素需要使用erase
方法
mySet.erase(1);
find()
方法用于查找特定元素是否存在于集合中,如果 find()
方法找到了要查找的元素,它会返回指向该元素的迭代器,如果未找到要查找的元素,它会返回一个指向集合的 end()
的迭代器,表示未找到。通过比较find()
方法返回的迭代器是否等于 end()
,可以确定集合中是否有查找的元素。
// 判断元素是否在集合中, 只要不等于end(), 说明元素在集合中
if (mySet.find(i) != mySet.end()) {
}
3.迭代器iterator
迭代器iterator
提供了一种类似指针的接口,可以用来遍历访问容器(比如数组、集合)中的元素,并执行各种操作。
可以理解为,迭代器和下标运算符的作用一样,用来访问容器中的元素,并且迭代器可以从一个元素移动到另外一个元素。
迭代器都拥有名为begin()
和end()
的成员,表示指向第一个元素和最后一个元素的下一个元素的迭代器(尾后迭代器),如果容器为空,则begin
和end
返回的是同一个迭代器。
可以使用比较运算符来判断两个迭代器是否相等,如果迭代器想要从一个元素移动到另外一个元素,可以使用递增++
运算符和递减--
运算符,表示向前(后)移动一个位置。
通过解引用*
可以获取迭代器所指的对象,下面的示例表示了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;
}
三、完整代码
完整代码如下
#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;
// 使用insert方法将数据放进set中
uset.insert(val);
}
cin >> m;
// 使用find()方法查询m是否在set里
if (uset.find(m) != uset.end()) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
总结
哈希表的另外一种形式set
的使用,要区分开来set
、``unordered_set,
multiset `这三种实现,并熟悉其基本操作。