set是一个能储存单键的容器;
它最大的特性就是那个键最多出现一次;
一
set有很多操作
1.构造
2.插入
3.遍历
4.查找和读取
5.删除
#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
#include<iostream>
#include<set>
#define mmset(a,b) memset(a,sizeof(b),a);
using namespace std;
int main()
{
set <string> data; //1.构造键类型为string的一个set容器
//2.插入
data.insert("ddd"); //在容器内部并不是按照插入的顺序排序的,而是
data.insert("eee"); //按照关键字从小到大排序的
data.insert("aaa");
data.insert("bbb");
data.insert("ccc");
;
//3.遍历
//正向遍历
set <string> ::iterator iter;
for(iter = data.begin(); iter != data.end(); iter++)
{
cout<<*iter<<endl; //迭代器iter可以当做指针, 所以在输出值
//之前要解引用
}
//反向遍历
set <string>:: reverse_iterator riter;
for(riter= data.rbegin(); riter != data.rend(); riter++)
{
cout<<*riter<<endl;
}
//4.查找和读取
//查找
cout<<data.count("aaa") <<endl; //若存在查找的值输出1,不存在输出0
cout<<data.count("ccc")<<endl;
//读取
cout<<*(data.find("aaa"))<<endl; //find返回带查找的值在容器内的迭代器
//若不存在程序会崩溃
//5.删除
data.erase(data.find("aaa")); //删除数据"aaa"
data.erase(data.begin(),data.end());//把迭代器从begin到end之间的内容全部清除
return 0;
}
需要的是这里的data.end()并不是最后一个元素,而是最后一个元素之后的一个起到结束标志的迭代器;
data.erase(iter1,iter2)删除的是[iter1,iter2)的内容,并不包括iter2;
二
set自定义去重和自定义排序
#include<stdio.h>
#include<string>
#include<iostream>
#include<set>
#include<algorithm>
#define ll long long
#define mmset(a,b) memset(a,b,sizeof(a))
#define iter set<node>::iterator
#define riter set<node>::reverse_iterator
using namespace std;
struct node
{
int x,y;
node()
{
}
node (int px, int py)
{
x = px;
y = py;
}
bool operator < (const node b) const //重载<
{
if(x == b.x) //如果两者相等,返回false,不插入b
{
return false;
}
else
{
if(y != b.y)
{
return y > b.y;//如果y>b.y,那么this排在b前面
}
else
{
return x > b.x;
}
}
}
};
int main()
{
set<node> data;
data.insert(node(1,2));
data.insert(node(1,3));
data.insert(node(1,4));
data.insert(node(4,2));
data.insert(node(2,2));
data.insert(node(3,3));
data.insert(node(5,5));
data.insert(node(7,1));
data.insert(node(9,2));
for(iter i = data.begin(); i != data.end(); i++)
{
cout<<i->x<<" "<<i->y<<endl;
}
return 0;
}