set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,

在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。

方法 用法
插入删除
insert(value) 向集合中插入一个元素
erase() 擦除元素中的一个或者一段元素
clear() 清除集合中的元素
查找
find() 查找value的值,返回下标位置,否则,返回最后一个元素后面一个位置(即迭代器的end)
容量
empty() 判断集合是否为空
size() 返回集合中的元素个数
max_size() 返回集合的最大容量
迭代器
begin() 返回开头的迭代器
end() 返回结尾的迭代器
rbegin() 反向遍历的首个位置迭代器
rend() 反向遍历的最后位置的迭代器

 #include<iostream>
#include<set>
using namespace std;
int main()
{
set<int> s;
s.insert();
s.insert();//将key_value插入到set中
s.insert();
s.insert();
s.insert();
s.insert();
cout<<"set的size值为:"<<s.size()<<endl;//输s.size()出该set集合中的元素个数
cout<<"set的maxsize的值为:"<<s.max_size()<<endl;//max_size()输出地址
cout<<"set中的第一个元素是:"<<*s.begin()<<endl;//begin()输出最小的元素
cout<<"set中的最后一个元素是:"<<*s.end()<<endl;//end()输出最大的元素
cout<<"set中的是否出现过该元素是:"<<s.count()<<endl;//s.count(1)可以判断是否出现过该元素,出现为1,未出现为0
//equal_range()分别表示第一个大于或等于给定元素和第一个大于元素
pair<set<int>::const_iterator,set<int>::const_iterator> pr;
pr = s.equal_range();
cout<<"第一个大于等于 2 的数是 :"<<*pr.first<<endl;
cout<<"第一个大于 2的数是 : "<<*pr.second<<endl;
s.clear();//清空集合
if(s.empty())//判断集合是否为空
{
cout<<"set为空!!!"<<endl;
}
cout<<"set的size值为:"<<s.size()<<endl;
cout<<"set的maxsize的值为:"<<s.max_size()<<endl; int a[] = {,,};//建立set集合二
set<int> s2(a,a+);
set<int>::iterator iter;
//find(),返回给定值值得定位器,如果没找到则返回end()。
if((iter = s2.find()) != s2.end()) //如果该数存在则会输出括号里的信息
{
cout<<"测试"<<*iter<<endl;
}
int b[]={,,};
s2.insert(b,b+);//将定位器first到second之间的元素插入到set中
cout<<"set的size值为:"<<s2.size()<<endl;//返回s2中的元素个数
cout<<*s2.lower_bound()<<endl;//lower_bound(8)返回第一个大于等于key_value的定位器
cout<<*s2.upper_bound()<<endl; //upper_bound(8)返回最后一个大于等于key_value的定位器
}

 uva 10815代码:

#include<iostream>
#include<set>
#include<string.h>
#include<sstream>
using namespace std;
int main()
{
set<string>s;
string h,buf;
while(cin>>h)
{
for(int i=;i<h.length();i++)
{
if(isalpha(h[i])) //判断一个字符是否为字母
h[i]=tolower(h[i]);
else
h[i]=' ';
}
stringstream ss(h);//定义了一个字符串流,并用一个字符串初始化
while(ss>>buf)//将buf读出到ss
s.insert(buf); }
//输出时需要运用迭代器
set<string>::iterator it;
for(it=s.begin();it!=s.end();it++)
cout<<(*it)<<"\n";
return ;
}

代码解析:

#include<iostream>
#include<set>
#include<string>
#include<sstream>
using namespace std;
int main()
{
string s,buf;
set<string> str;
while(cin>>s)
{
for(int i=;i<s.length();i++)
{
if(isalpha(s[i]))//将字母统一为小写,非字母的设为空格到时候便于忽略
s[i]=tolower(s[i]);
else
s[i]=' ';
}
stringstream ss(s);//设一个字符串流,用s来初始化
while(ss>>buf)//由于ss中可能有空格,这个就是以空格为界限 循环输入到buf(buf是不含空格的字符串(即单词))中
str.insert(buf);
}
for(set<string>::iterator it=str.begin();it!=str.end();it++)
cout<<*it<<endl;
getchar();
}

定义比较函数 例题:

typedef struct mycmp //自定义比较函数
{
bool operator()(const int &a,const int &b)
{
return a>b;
}
};

#include<iostream>
#include<set>
#include<string.h>
#include<sstream>
using namespace std;
typedef struct mycmp //自定义比较函数
{
bool operator()(const int &a,const int &b)
{
return a>b;//改变这里的>号改变顺序大小
}
};
int main()
{
set<int,mycmp>s;
s.insert();
s.insert();
s.insert();
for(int i=;i<;i++)//顺序输入值
s.insert(i); cout<<"顺序输出:"<<endl;
set<int>::iterator it;
for(it=s.begin();it!=s.end();it++)
cout<<*it<<" "; cout<<endl<<"反序输出:"<<endl;
set<int>::reverse_iterator reit;
for(reit=s.rbegin();reit!=s.rend();reit++)
cout<<*reit<<" ";
return ;
}

定义数据类型  结构体例题:

typedef struct mycmp
{
string name;
float score;
bool operator<(const mycmp &a)const//自定义比较函数
{
return a.score<score;//可更改这处的>而更改输出顺序
}
};

#include<iostream>
#include<set>
#include<string.h>
#include<sstream>
using namespace std;
typedef struct mycmp
{
string name;
float score;
bool operator<(const mycmp &a)const//自定义比较函数
{
return a.score<score;//可更改这处的>而更改输出顺序
}
};
int main()
{
set<mycmp> v;
mycmp 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=;
v.insert(s); set<mycmp>::iterator p;
for(p=v.begin(); p!=v.end(); p++)
{
cout<<(*p).name<<" : "<<(*p).score<<endl;
}
return ;
}

输出结果:(按crtl+z+alt)
Jack : 80.5
Nacy : 60.5
Tomi : 20

例题一:01串排序:将01串首先按长度排序,长度相同按1的个数排序,1的个数相同按ASCII码排序

输入:

10011111

00001101

1010101

1

0

1100

解题想法:使用set自定义比较函数,先看字符串长度,长度从小到大,如果长度相同,比较1的个数,我们这里用#include<algorithm>中的count(s1.begin(),s1.end(),'1')来计算1的个数,如果1的个数相同,按ascii码排序,个数不同,按个数大小排序

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);
}
};

#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(),'');
int c2=count(s2.begin(),s2.end(),'');
if(c1!=c2)
return (c1<c2);
else
return(s1<s2);
}
};
int main()
{
set<string,Comp> s;
string t;
int n;
while(cin>>t)
{
s.insert(t);
}
set<string,Comp>::iterator it;
for(it=s.begin(); it!=s.end(); it++)
cout<<*it<<endl;
return ;
}

例题二:输入若干个时间,对其进行排序,从小到大输出

解题思路:定义自定义struct数据类型

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);
}
};

输入:

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()
{
set<struct time> s;
struct time t;
int n;
cin>>n;
for(int i=; i<n; i++)
{
cin>>t.hour;
cin.get();
cin>>t.minute;
cin.get();
cin>>t.second;
s.insert(t);
}
set<struct time>::iterator it;
for(it=s.begin(); it!=s.end(); it++)
cout<<(*it).hour<<":"<<(*it).minute<<":"<<(*it).second<<endl;
return ; }

STL之set(唯一且有顺序)的更多相关文章

  1. C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用

    摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...

  2. STL六大组件之——容器知识大扫盲

    STL中的容器主要涉及顺序容器类型:vector.list.deque,顺序容器适配器类型:stack.queue.priority_queue.标准库中的容器分为顺序容器和关联容器.顺序容器(seq ...

  3. STL用法大全

    1.    概述 泛型编程思想最早缘于A.Stepanov提出的部分算法可独立于数据结构的论断.20世纪90年代初A.Stepanov和Meng Lee根据泛型编程的理论用C++共同编写了STL.但直 ...

  4. STL使用总结

    转载于http://blog.csdn.net/daisy_chenting/article/details/6898184 1.    概述 泛型编程思想最早缘于A.Stepanov提出的部分算法可 ...

  5. 《STL源码剖析》——第一、二、三章

     第一章:概论: 换句话说,STL所实现的,是依据泛型思维架设起来的一个概念结构.这个以抽象概念(abstract concepts)为主体而非以实际类(classes)为主体的结构,形成了一个严谨的 ...

  6. 关于Windows API、CRT和STL二三事

    1.本文编写目的    本文是为了帮助一些人弄清一些关于Windows API, C运行时程序库(CRT), 和标准C++库(STL)的基本概念.有很多人甚至是有经验的程序员在这些概念上是含糊不清的甚 ...

  7. [C++]STL中的容器

    C++11 STL中的容器 一.顺序容器: vector:可变大小数组: deque:双端队列: list:双向链表: forward_list:单向链表: array:固定大小数组: string: ...

  8. sql server中查询结果集顺序问题

    因为优化器可能会选择并行处理,或者在多文件情况下不按“期待”顺序扫描数据,所以无法保证数据的顺序.唯一能确保顺序的只有order by. 并行处理的过程导致顺序不一致,单核上不存在并行,而双核,可能使 ...

  9. C++利用动态数组实现顺序表(不限数据类型)

    通过类模板实现顺序表时,若进行比较和遍历操作,模板元素可以通过STL中的equal_to仿函数实现,或者通过回调函数实现.若进行复制操作,可以采用STL的算法函数,也可以通过操作地址实现.关于回调函数 ...

随机推荐

  1. iBase4J项目笔记

    目录: 1 数据库密码加密 2 service层概述 3 web层概述 4 后端CRUD 4.1 READ 4.2 UPDATE 4.3 CREATE 4.4 DELETE 5 facade层概述 1 ...

  2. (转)typedef和#define的用法与区别

    typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: ...

  3. php学习笔记-do while循环

    do{ func(); }while(condition) do while执行逻辑是先执行循环体里面的代码,再判断condition是否为true,如果是则和while循环一样了.如果conditi ...

  4. SingletonPattern(23种设计模式之一)

    设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计模式六大 ...

  5. conda 添加bioconda源,创建/删除/重命名环境

    1.conda安装 在https://repo.continuum.io/miniconda/选择conda版本 wget "https://repo.continuum.io/archiv ...

  6. 关于 block的一些浅识

    block的定义:“带自动变量的匿名函数” (一)写法: ^ void (int iAge){ NSLog(@"%d", iAge);}; 和C函数写法区别在于: 1) :以插入符 ...

  7. PersonDto中@ResourceAccess(readOnly = true)以及swagger的理解-----似懂非懂,日后消化

    @JsonApiResource(type = PersonDto.RESOURCE_TYPE) @EntityMapping(entityClass = Person.class) //@Resou ...

  8. C++面试笔记--面向对象

    说到面向对象,大家第一反应应该就是它的三大特性:封装性.继承性和多态性.那么我们先简单的了解一下这三大特性: (1)封装性:封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的 ...

  9. Gremlin:图遍历语言

    Gremlin简介 Gremlin是Apache TinkerPop 框架下的图遍历语言.Gremlin是一种函数式数据流语言,可以使得用户使用简洁的方式表述复杂的属性图(property graph ...

  10. 《Effective Java》第4章 类和接口

    第13条:使类和成员的可访问性最小化 第一规则很简单:尽可能地使每个类或者成员不被外界访问.换句话说.应该使用与你正在编写的软件的对应功能相一致的.尽可能最小的访问级别. 对于顶层的(非嵌套的)类和接 ...