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