(转)set集合的用法
原地址:http://blog.csdn.net/chaiwenjun000/article/details/50561775
SET 集合
百度百科中说集合中的元素有三个特征:
1.确定性(集合中的元素必须是确定的) 2.互异性(集合中的元素互不相同。例如:集合A={1,a},则a不能等于1) 3.无序性(集合中的元素没有先后之分。)
而STL中的集合set ,按照定义保证了元素的确定性,互异性,神奇的是其中的元素却是有序的!
卓越的前辈们在c++里为我们封装好了set,只需要在头文件里
- #include<set>
- using namespace std;
就可以方便的使用了。
如何定义一个set?
- set<_type> _name;
- _type集合元素的类型 ,除了基本类型也可以是自定义类型。
- _name 该集合的名称
我们以int为例做一下示范
先介绍几个set常用的函数
.insert(v) //插入一个元素v
.erase(v) //删除一个元素v (可以是元素的值,也可以是迭代器(后面会有介绍))
.empty() //判断是否为空
.count(v)//判断 v出现了几次
- #include<set>
- using namespace std;
- int main(){
- set<int>st; //定义了一个int类型的集合,名称为st
- st.insert(1); st.insert(7); st.insert(4);
- if(!st.empty())
- printf("yes\n");
- if(st.count(1)) printf("1yes\n"); else printf("1no\n");
- if(st.count(2)) printf("2yes"); else printf("2no\n");
- }
SET的应用
有了这几个函数,set就可以做很多事了,其中最常用的就是 判断一个数是否出现过。
set内部使用红黑树实现,也就是平衡的二叉树查找树,其插入删除查找的效率是稳定的O(logn)。这个效率是很高的,当然设计合适的hash函数速度更快O(1),但对于一般的问题这个已经足够了,而且简单书写。
下面就以昨天CF第三题为例做下示范
http://codeforces.com/contest/620/problem/C
长度为n的珠子链, 从左到右位置标号1~n, 每个位置的珠子可能有不同的种类,
规定连续的一段中如果存在两个珠子种类相同,则称为好珠子段,问最多有多少好珠子段,并打印段的位置。
方法
直接贪心,遇到两个相同的珠子,就记录下来位置。然后将之前的标记清空。
标记方法? ai 范围 1≤ ai ≤ 10^9,开那么大的数组显然不行,而且清空也麻烦
直接用set即可!
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <set>
- using namespace std;
- const int maxn = 100000*4;
- int arr[maxn];
- int cnt[maxn];
- set<int>st;
- int main()
- {
- int t;
- scanf("%d",&t);
- int c = 0;
- for(int i=0;i<t;i++){
- scanf("%d",&arr[i]);
- if(!st.count(arr[i])) //没有标记过的
- st.insert(arr[i]);
- else
- {
- st.clear(); //清空set
- cnt[c++] = i+1; //记录标记的位置(出现第二次的珠子位置)
- }
- }
- cnt[c-1] = t;
- if(c == 0)
- printf("-1\n");
- else{
- printf("%d\n",c);
- int l = 1;
- for(int i=0;i<c;i++){
- printf("%d %d\n",l,cnt[i]);
- l = cnt[i]+1;
- }
- }
- return 0;
- }
SET的遍历
这里用到了迭代器的相关知识,学完C++后再去深究,这里知道怎么用就行了。
前面说了set中的元素是有序的,那么我们来遍历一下。
- #include<set>
- using namespace std;
- int main(){
- set<int>st; //定义了一个int类型的集合,名称为st
- st.insert(1); st.insert(7); st.insert(4);
- st.insert(0);
- for(set<int>::iterator it = st.begin();it!=st.end();++it){
- printf("%d ",*it);
- }
- }
- 可以看出迭代器的使用和指针类似 , 也是通过解引用运算符 *it来获取值,也可以通过++ -- 移动。
- 也可以单个取出元素
- set<int>::iterator it = st.begin();
- printf("%d\n",*it);
- 注意这里的.begin()代表了set中的首元素位置,而.end()代表的是尾元素位置的下一个位置。
- STL中很多容器都是这样的左闭右开区间,不用去深究。
SET 集合
百度百科中说集合中的元素有三个特征:
1.确定性(集合中的元素必须是确定的) 2.互异性(集合中的元素互不相同。例如:集合A={1,a},则a不能等于1) 3.无序性(集合中的元素没有先后之分。)
而STL中的集合set ,按照定义保证了元素的确定性,互异性,神奇的是其中的元素却是有序的!
卓越的前辈们在c++里为我们封装好了set,只需要在头文件里
- #include<set>
- using namespace std;
就可以方便的使用了。
如何定义一个set?
- set<_type> _name;
- _type集合元素的类型 ,除了基本类型也可以是自定义类型。
- _name 该集合的名称
我们以int为例做一下示范
先介绍几个set常用的函数
.insert(v) //插入一个元素v
.erase(v) //删除一个元素v (可以是元素的值,也可以是迭代器(后面会有介绍))
.empty() //判断是否为空
.count(v)//判断 v出现了几次
- #include<set>
- using namespace std;
- int main(){
- set<int>st; //定义了一个int类型的集合,名称为st
- st.insert(1); st.insert(7); st.insert(4);
- if(!st.empty())
- printf("yes\n");
- if(st.count(1)) printf("1yes\n"); else printf("1no\n");
- if(st.count(2)) printf("2yes"); else printf("2no\n");
- }
SET的应用
有了这几个函数,set就可以做很多事了,其中最常用的就是 判断一个数是否出现过。
set内部使用红黑树实现,也就是平衡的二叉树查找树,其插入删除查找的效率是稳定的O(logn)。这个效率是很高的,当然设计合适的hash函数速度更快O(1),但对于一般的问题这个已经足够了,而且简单书写。
下面就以昨天CF第三题为例做下示范
http://codeforces.com/contest/620/problem/C
长度为n的珠子链, 从左到右位置标号1~n, 每个位置的珠子可能有不同的种类,
规定连续的一段中如果存在两个珠子种类相同,则称为好珠子段,问最多有多少好珠子段,并打印段的位置。
方法
直接贪心,遇到两个相同的珠子,就记录下来位置。然后将之前的标记清空。
标记方法? ai 范围 1≤ ai ≤ 10^9,开那么大的数组显然不行,而且清空也麻烦
直接用set即可!
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <set>
- using namespace std;
- const int maxn = 100000*4;
- int arr[maxn];
- int cnt[maxn];
- set<int>st;
- int main()
- {
- int t;
- scanf("%d",&t);
- int c = 0;
- for(int i=0;i<t;i++){
- scanf("%d",&arr[i]);
- if(!st.count(arr[i])) //没有标记过的
- st.insert(arr[i]);
- else
- {
- st.clear(); //清空set
- cnt[c++] = i+1; //记录标记的位置(出现第二次的珠子位置)
- }
- }
- cnt[c-1] = t;
- if(c == 0)
- printf("-1\n");
- else{
- printf("%d\n",c);
- int l = 1;
- for(int i=0;i<c;i++){
- printf("%d %d\n",l,cnt[i]);
- l = cnt[i]+1;
- }
- }
- return 0;
- }
SET的遍历
这里用到了迭代器的相关知识,学完C++后再去深究,这里知道怎么用就行了。
前面说了set中的元素是有序的,那么我们来遍历一下。
- #include<set>
- using namespace std;
- int main(){
- set<int>st; //定义了一个int类型的集合,名称为st
- st.insert(1); st.insert(7); st.insert(4);
- st.insert(0);
- for(set<int>::iterator it = st.begin();it!=st.end();++it){
- printf("%d ",*it);
- }
- }
- 可以看出迭代器的使用和指针类似 , 也是通过解引用运算符 *it来获取值,也可以通过++ -- 移动。
- 也可以单个取出元素
- set<int>::iterator it = st.begin();
- printf("%d\n",*it);
- 注意这里的.begin()代表了set中的首元素位置,而.end()代表的是尾元素位置的下一个位置。
- STL中很多容器都是这样的左闭右开区间,不用去深究。
(转)set集合的用法的更多相关文章
- 关于comparable与comparator的用法(即自定义集合框架用法 )
package javastudy; import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet; ...
- C++ set集合容器用法解析
1.简介 set是C++STL库中的一个容器,他十分的便利,所有的元素插入时都会被自动排序,并且容器内保证元素不重复,就想高一数学中讲的集合具有互异性一样,(好像set本来就叫集合容器 bushi)2 ...
- Delphi集合的用法
参考:http://www.cnblogs.com/doit8791/archive/2012/08/17/2644859.html 集合是Pascal特有的数据类型,在Visual Basic.C/ ...
- set集合的用法总结(转)
python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和 ...
- UICollectionView 集合视图用法,自定义Cell
在View里面 //1.创建UICollectionViewFlowLayout UICollectionViewFlowLayout *flowLayout=[[UICollectionViewFl ...
- delphi 集合的用法
http://blog.sina.com.cn/s/blog_9e2e8405010180jy.html delphi基础补充 1 开域语句 在面向对象的程序代码中,嵌套对象的现象十分 ...
- 认识python中的set集合及其用法
python中,集合(set)是一个无序排列,可哈希, 支持集合关系测试,不支持索引和切片操作,没有特定语法格式, 只能通过工厂函数创建.集合里不会出现两个相同的元素, 所以集合常用来对字符串或元组或 ...
- remove集合的用法
循环集合的方法有三种: 简单for循环 iterator循环 增强for循环 例子如下: List<Long> fList = new ArrayList<Long>(); f ...
- Python中字典和集合的用法
本人开始学习python 希望能够慢慢的记录下去 写下来只是为了害怕自己忘记. python中的字典和其他语言一样 也是key-value的形式 利用空间换时间 可以进行快速的查找 key 是唯一的 ...
随机推荐
- Divide and conquer:Median(POJ 3579)
快速求两数距离的中值 题目大意:给你一个很大的数组,要你求两个数之间的距离的中值 二分法常规题,一个pos位就搞定的事情 #include <iostream> #include ...
- 【leetcode】 Scramble String (hard)★
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
- struts2封装客户端数据到Action
1.在Action中定义简单数据类型的属性 给Action定义简单类型的属性,封装客户端请求的数据 简单类型:String,基本类型和对应的引用类型 只要保证客户端请求的参数名称和Action的属性名 ...
- [Android Pro] synchronized与static synchronized 的区别
reference to : http://www.cnblogs.com/shipengzhi/articles/2223100.html 1.synchronized与static synchr ...
- August 26th 2016 Week 35th Friday
It always seems impossible until it's done. 在事情未完成之前,一切都看似不可能. When I was young, once I had to lift ...
- 解决eclipse ctrl+鼠标左键不能用
选择[Window]菜单 Preferences ——>General——>Editors——>Text Editors——>Hyperlinking 把勾都点上,然后确定KE ...
- python基础——装饰器
python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...
- Volley学习总结
本文主要包括以下内容 volly基本操作(String与Json类型) volly图片操作 自定义volly volly源码分析 Volley简单易用,在性能方面也进行了大幅度的调整,它的设计目标就是 ...
- Linux内存性能指标、CPU性能指标
内存性能指标 内存基础概念 先执行一下 top 命令,看结果中关于内存的相关部分 # top 其中的 VIRT.RES.SWAP 都是什么呢? 分别是下面的3个概念: 物理内存 Resident - ...
- windows 下的tcping 小插件
如果把插件放在根目录 就要能过cmd切换到根目录 cd \ c:\>tcping -d -t -i 0.06 www.baidu.com 将文件放在c:\WINDOWS\system32目录下, ...