set
set是STL中一种常用的容器,关于set,必须说明的是set关联式容器。 set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序(默认升序,字典序)。
首先引用set需要头文件#include<set>
对于set的操作大致有以下几种:
set<int> s 定义一个set容器 类型为int型
s.begin() 返回指向第一个元素的迭代器
s.clear() 清除所有元素
s.count() 返回bool型,有返回1,无返回0
s.empty() 如果集合为空,返回true
s.end() 返回指向最后一个元素之后的迭代器,不是最后一个元素
s.erase() 删除集合中的元素
s.find() 返回一个指向被查找到元素的迭代器,如果没找到则返回end()
s.insert() 在集合中插入元素
s.size() 集合中元素的数目
s.swap() 交换两个集合变量
遍历set的用法,以及详细操作大家可以参考一下这位聚聚的博客,写的非常详细呀!!orz
https://blog.csdn.net/byn12345/article/details/79523516?ops_request_misc=&request_id=&biz_id=102&utm_term=c++%25E5%25A6%2582%25E4%25BD%2595%25E9%2581%258D%25E5%258E%2586set&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-6-79523516.first_rank_v2_pc_rank_v29
来看一道很经典的题目
题意:给出 n个数,找到尽量长的一个序列,使得该序列中没有重复的元素
思路:对于该类段查找问题可以采用经典的滑动窗口方法,即维护一个窗口,窗口的左右边界用两个变量L,R代表,先增加R直到出现重复数字,再增加L,再增加R,直到R达到n
首先分析一下样例,如果下一个数字在set中出现过,那我们就移动L一直到L到R之间的元素都不和下一个数字相同。
代码如下
#include<iostream>
#include<set>
using namespace std;
set<int>s;
int a[1234567];
int main() {
int n;
scanf("%d", &n);
while (n--) {
s.clear();
int t;
scanf("%d", &t);
for (int i = 1; i <= t; i++)scanf("%d", &a[i]);
int l = 1, r = 1, res = 0;
while (r <= t)
{
while (r <= t && !s.count(a[r]))s.insert(a[r++]);
res = max(res, r - l);
s.erase(a[l++]);
}
printf("%d\n", res);
}
}
再来一道与字符串的结合
题目大意:安迪想整个字典,结果认识的字太少,现在给你一段英文句子,把里面不同的单词存起来,按小写的字典序输出。
#include <iostream>
#include<string>
#include <set>
#include <cstdio>
using namespace std;
set<string>se;
string op;
int main() {
char ch;
while ((ch = getchar())!=EOF) {
if (!isalpha(ch))continue;//也可以用isspace()判断是不是空格
while (isalpha(ch)) {
op += tolower(ch);
ch = getchar();
}
se.insert(op);
op.clear();//每次插入之后就清空一下op
}
set<string>::iterator it = se.begin();//定义迭代器遍历
for (it = se.begin(); it != se.end(); it++) {
cout << *it << endl;//迭代器代表的是他所指的地址,所以我们输出时要指向这个地址
}
}
里面用到了几个陌生的函数
isalpha() // 用来判断读入的字符是不是字母(不区分大小写)
tolower()//将大写字母转化为小写字母
好啦set就到这啦