STL之set(唯一且有顺序)
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(唯一且有顺序)的更多相关文章
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...
- STL六大组件之——容器知识大扫盲
STL中的容器主要涉及顺序容器类型:vector.list.deque,顺序容器适配器类型:stack.queue.priority_queue.标准库中的容器分为顺序容器和关联容器.顺序容器(seq ...
- STL用法大全
1. 概述 泛型编程思想最早缘于A.Stepanov提出的部分算法可独立于数据结构的论断.20世纪90年代初A.Stepanov和Meng Lee根据泛型编程的理论用C++共同编写了STL.但直 ...
- STL使用总结
转载于http://blog.csdn.net/daisy_chenting/article/details/6898184 1. 概述 泛型编程思想最早缘于A.Stepanov提出的部分算法可 ...
- 《STL源码剖析》——第一、二、三章
第一章:概论: 换句话说,STL所实现的,是依据泛型思维架设起来的一个概念结构.这个以抽象概念(abstract concepts)为主体而非以实际类(classes)为主体的结构,形成了一个严谨的 ...
- 关于Windows API、CRT和STL二三事
1.本文编写目的 本文是为了帮助一些人弄清一些关于Windows API, C运行时程序库(CRT), 和标准C++库(STL)的基本概念.有很多人甚至是有经验的程序员在这些概念上是含糊不清的甚 ...
- [C++]STL中的容器
C++11 STL中的容器 一.顺序容器: vector:可变大小数组: deque:双端队列: list:双向链表: forward_list:单向链表: array:固定大小数组: string: ...
- sql server中查询结果集顺序问题
因为优化器可能会选择并行处理,或者在多文件情况下不按“期待”顺序扫描数据,所以无法保证数据的顺序.唯一能确保顺序的只有order by. 并行处理的过程导致顺序不一致,单核上不存在并行,而双核,可能使 ...
- C++利用动态数组实现顺序表(不限数据类型)
通过类模板实现顺序表时,若进行比较和遍历操作,模板元素可以通过STL中的equal_to仿函数实现,或者通过回调函数实现.若进行复制操作,可以采用STL的算法函数,也可以通过操作地址实现.关于回调函数 ...
随机推荐
- Luogu 3332 [ZJOI2013]K大数查询
BZOJ 3110 很早就想写的试炼场题. 不会整体二分啊呜呜呜,只能写写树套树. 有一个trick就是外层使用一个权值线段树,把位置作为下标的线段树放在内层,这样子的话我们在查询$k$大的时候就可以 ...
- linux ftp、sftp、telnet服务开通、更改Orale最大连接数
1 ftp服务开通 1.1 检测vsftpd是否安装及启动 先用service vsftpd status 来查看ftp是否开启.也可以使用ps -ef | grep ftp 来查看本地是否含有包含f ...
- CodeForces 566D Restructuring Company (并查集+链表)
题意:给定 3 种操作, 第一种 1 u v 把 u 和 v 合并 第二种 2 l r 把 l - r 这一段区间合并 第三种 3 u v 判断 u 和 v 是不是在同一集合中. 析:很容易知道是用并 ...
- repo的一些用法
repo的用法注:repo只是google用Python脚本写的调用git的一个脚本,主要是用来下载.管理Android项目的软件仓库.(也就是说,他是用来管理给git管理的一个个仓库的) 1.下载r ...
- java8之lambda表达式&方法引用(一)
本文将简单的介绍一下Lambda表达式和方法引用,这也是Java8的重要更新,Lambda表达式和方法引用最主要的功能是为流(专门负责迭代数据的集合)服务. 什么是lambda表达式 可以把lambd ...
- 关于redis-windows环境下的一些配置:
如果报错: The Windows version of Redis allocates a memory mapped heap for sharing with the forked proces ...
- 在ubuntu 14.04 编译android 2.3.1 错误解决办法
首先必须降低gcc版本: sudo apt-get install gcc-4.4sudo apt-get install g++-4.4sudo rm -rf /usr/bin/gcc /usr/b ...
- 在GridView控件FooterTemplate内添加记录 Ver2
中午有发表一篇博文<在GridView控件FooterTemplate内添加记录> http://www.cnblogs.com/insus/p/3269908.html 添加铵钮是放在F ...
- IMP-00003: 遇到 ORACLE 错误 959 ORA-00959: 表空间 '' 不存在
描述 在使用imp命令将dmp文件导入oracle中时,遇到如下错误: IMP: 遇到 ORACLE 错误 ORA: 表空间 'TBS_CDUSER' 不存在 IMP命令如下: IMP cduser/ ...
- 【转】ClickOnce部署Winform程序的方方面面
源地址:http://www.cnblogs.com/parry/archive/2012/10/30/ClickOnce_Winform_Deployment.html