ACM学习历程10——set集合容器
2016-08-25 09:41
399 查看
Set集合容器,是一种实现了平衡二叉树的数据结构,容器中的数据不能重复,即每个数据都是唯一的,而且容器中的数据页数不能直接修改的,因为修改后的数据很可能不在原来的数位上。Set容器的主要目的是快速检索数据元素,减速时采用中序遍历,可将容器内数据由小到大遍历处理。需要注意的是,关联容器的迭代器不支持it+n操作,仅支持it++。
Set容器的定义和使用方法如下:
(一)Set容器的定义:
set<类型>
对象名;
如:set<int> s;
set<类型,比较结构体>
对象名;
如:set<int,myComp> s; Set容器在插入时,默认情况下按从小到大的顺序存储,可以通过自定义比较结构体,按从大到小的顺序存储或者按照多个关键字序列插入。
(二)添加元素:
set<int> s;
s.insert(8);
s.insert(10);
s.insert(6);
s.insert(8); 重复元素不会插入
(三)遍历访问:
(1)顺序遍历:
set<int> s;
set<int>::iterator it;
for(it=s.begin();it!=s.end();s++)
*it;
(2)反序遍历:
set<int>::reverse_iterator it;
for(it=s.rbegin();it!=s.rend();s++)
*it;
(四)删除元素:
erase(迭代器)
erase(元素值)
erase(迭代器1,迭代器2)
clear(),清空容器,相当于删除所有的元素。
(五)查找元素:
find (元素),返回一个迭代器值。查找结果:找到了,返回指向该元素的迭代器;没找到,返回s.end();
(六)自定义比较函数:
(1)当set中存储的数据,需要按自定义的规则进行比较大小时;
(2)当set中存储的是自定义数据时,如结构体,类等。
第一种情况,元素类型不是结构体。
首先,定义比较结构体
struct myComp
{
bool operator() (const 类型
&a, const 类型
&b)
{
……return(a>b);
}
};
然后,定义set:
set<类型,myComp> s;
第二种情况,元素类型是结构体。
首先,在结构体中,增加“operator <”函数
struct 结构体
{
bool operator < (const 结构体类型
&a)
{
……return(…);
}
};
然后,定义set
set<类型> s;
Example:
(七)考虑使用Set的情况:
(1)排序,插入到容器内的数据是随机的,插入后,数据是有序的。
(2)需要在容器内实现快速查找。
(3)某一条件要求多个结果是相等的,此时可利用set中数据的唯一性。
应用举例一:
01串排序:将01串首先按长度排序,长度相同按1的个数排序,1的个数相同按ASCII码排序
输入:
10011111
00001101
1010101
1
0
1100
输出:
0
1
1100
1010101
00001101
10011111
测试数据通过文件读入:
![](http://img.blog.csdn.net/20160825092948982?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20160825092842747?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
应用举例二:
输入若干个时间,对其进行排序,从小到大输出
输入:
3
12:59:30
1:20:40
1:20:30
输出:
1:20:30
1:20:40
12:59:30
输入数据:
![](http://img.blog.csdn.net/20160825093409546?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20160825093328145?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
Set容器其他操作方法可以参考下表,并查询相关的帮助文档:
Set容器的定义和使用方法如下:
(一)Set容器的定义:
set<类型>
对象名;
如:set<int> s;
set<类型,比较结构体>
对象名;
如:set<int,myComp> s; Set容器在插入时,默认情况下按从小到大的顺序存储,可以通过自定义比较结构体,按从大到小的顺序存储或者按照多个关键字序列插入。
(二)添加元素:
set<int> s;
s.insert(8);
s.insert(10);
s.insert(6);
s.insert(8); 重复元素不会插入
(三)遍历访问:
(1)顺序遍历:
set<int> s;
set<int>::iterator it;
for(it=s.begin();it!=s.end();s++)
*it;
(2)反序遍历:
set<int>::reverse_iterator it;
for(it=s.rbegin();it!=s.rend();s++)
*it;
(四)删除元素:
erase(迭代器)
erase(元素值)
erase(迭代器1,迭代器2)
clear(),清空容器,相当于删除所有的元素。
(五)查找元素:
find (元素),返回一个迭代器值。查找结果:找到了,返回指向该元素的迭代器;没找到,返回s.end();
(六)自定义比较函数:
(1)当set中存储的数据,需要按自定义的规则进行比较大小时;
(2)当set中存储的是自定义数据时,如结构体,类等。
第一种情况,元素类型不是结构体。
首先,定义比较结构体
struct myComp
{
bool operator() (const 类型
&a, const 类型
&b)
{
……return(a>b);
}
};
然后,定义set:
set<类型,myComp> s;
第二种情况,元素类型是结构体。
首先,在结构体中,增加“operator <”函数
struct 结构体
{
bool operator < (const 结构体类型
&a)
{
……return(…);
}
};
然后,定义set
set<类型> s;
Example:
#include<iostream> #include<set> using namespace std; typedef struct non { bool operator()(const int &a,const int &b) { if(a!=b) return a>b; else return a>b; } } STU; int main() { set<int,STU> v; set<int,STU>::iterator p; v.insert(5); v.insert(4); v.insert(7); v.insert(2); v.insert(9); for(p=v.begin(); p!=v.end(); p++) cout<<*p<<' '; cout<<endl; } 输出结果:9 7 5 4 2
#include<iostream> #include<set> #include<string> using namespace std; typedef struct non { string name; float score; bool operator<(const non &a) const { return a.score<score; } } STU; int main() { set<STU> v; STU s; s.name="Jack"; s.score=80.5; v.insert(s); s.name="Nacy"; s.score=60.5; v.insert(s); s.name="Tomi"; s.score=20; v.insert(s); set<STU>::iterator p; for(p=v.begin(); p!=v.end(); p++) { cout<<(*p).name<<" : "<<(*p).score<<endl; } return 0; } 输出结果: Jack : 80.5 Nacy : 60.5 Tomi : 20
(七)考虑使用Set的情况:
(1)排序,插入到容器内的数据是随机的,插入后,数据是有序的。
(2)需要在容器内实现快速查找。
(3)某一条件要求多个结果是相等的,此时可利用set中数据的唯一性。
应用举例一:
01串排序:将01串首先按长度排序,长度相同按1的个数排序,1的个数相同按ASCII码排序
输入:
10011111
00001101
1010101
1
0
1100
输出:
0
1
1100
1010101
00001101
10011111
测试数据通过文件读入:
#include<iostream> #include<fstream> #include<set> #include<string> #include<algorithm> using namespace std; struct Comp { bool operator () (const string &s1,const string &s2) { if(s1.length()!=s2.length()) return(s1.length()<s2.length()); int c1=count(s1.begin(),s1.end(),'1'); int c2=count(s2.begin(),s2.end(),'1'); if(c1!=c2) return (c1<c2); else return(s1<s2); } }; int main() { ifstream fin("input.txt"); ofstream fout("output.txt"); set<string,Comp> s; string t; int n; while(fin>>t) { s.insert(t); } set<string,Comp>::iterator it; for(it=s.begin(); it!=s.end(); it++) fout<<*it<<endl; fin.close(); fout.close(); return 0; }输出结果:
应用举例二:
输入若干个时间,对其进行排序,从小到大输出
输入:
3
12:59:30
1:20:40
1:20:30
输出:
1:20:30
1:20:40
12:59:30
输入数据:
#include<iostream> #include<fstream> #include<set> using namespace std; struct time { int hour; int minute; int second; bool operator < (const time &a)const { if(hour!=a.hour) return(hour<a.hour); else if(minute!=a.minute) return(minute<a.minute); else return(second<a.second); } }; int main() { ifstream fin("input.txt"); ofstream fout("output.txt"); set<struct time> s; struct time t; int n; fin>>n; for(int i=0; i<n; i++) { fin>>t.hour; fin.get(); fin>>t.minute; fin.get(); fin>>t.second; s.insert(t); } set<struct time>::iterator it; for(it=s.begin(); it!=s.end(); it++) fout<<(*it).hour<<":"<<(*it).minute<<":"<<(*it).second<<endl; fin.close(); fout.close(); return 0; }输出结果:
Set容器其他操作方法可以参考下表,并查询相关的帮助文档:
相关文章推荐
- ACM学习历程11——Multiset集合容器的使用
- ACM学习历程13——multimap集合容器
- ACM学习历程17——bitset位集合容器
- ACM学习历程——HDU5137 How Many Maos Does the Guanxi Worth(14广州10题)(单源最短路)
- ACM学习历程9——string基本字符系列容器
- ACM学习历程—BestCoder 2015百度之星资格赛1002 列变位法解密(vector容器)
- Java学习之容器上(Collection接口常用方法,Iterator接口,使用foreach循环遍历Collection集合元素,Set集合通用知识(Hashset类,hashcode()与Lin
- Python学习笔记 - 10.集合(Set)
- ACM学习历程18——stack堆栈容器
- ACM学习历程12——Map映照容器
- 黑马程序员_学习笔记:10) 集合框架2:Set(HashSet、TreeSet)、Map(Hashtable、HashMap、TreeMap)、Collections、Arrays
- ACM学习历程6——Vector向量容器
- ACM学习历程15——list双向链表容器
- 103day(Java编译优化,对象容器,集合容器(set),散列表(Hash)和计算机操作系统发展和主要功能,直言三段论的学习)
- STL学习笔记-set/multiset容器(集合)
- Java集合源码学习(10)_Set接口的实现HashSet
- Java学习之容器上(Collection接口常用方法,Iterator接口,使用foreach循环遍历Collection集合元素,Set集合通用知识(Hashset类,hashcode()与LinkedHashSet类))
- ACM学习历程19——queue队列容器与priority_queue优先队列容器
- C++ STL set集合容器常用用法
- 3.python的set集合的操作示例——《深入python》学习