1. set容器
    4.1关联式容器
    4.2插入数据自动排序 按照key
    4.3 insert插入值
    4.4 erase参数可以传值 或者 迭代器
    4.5 find()返回值 迭代器 找不到返回的 endl()
    4.6 count计数 对于set而言 结果 就是 0 或者 1
    4.7. lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器
    4.8. upper_bound(keyElem);//返回第一的key>keyElem元素的迭代器
    4.9. equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器
    4.10 对组pair
    4.10.1 第一个值 first
    4.10.2 第二个值 second
    4.10.3 默认括号
    4.10.4 make_pair()
    4.11 set插入返回值 对组 <迭代器 ,是否成功标识>
    4.12 指定set的排序规则,利用仿函数
    4.13 set插入自定义数据类型
#include <iostream>
    using namespace std;
    #include <set>
    #include <string>
    // set   multiset 头文件  都是 #include <set>


    /*
    3.7.2.1 set构造函数
    set<T>st;//set默认构造函数
    mulitset<T>mst;//mulitset默认构造函数
    set(const set&st);//拷贝构造函数
    3.7.2.2 set赋值操作
    set operator=(const set &st);//重载等号操作符
    swap(st);//交换两个集合容器
    
    3.7.2.3 set大小操作
    size();//返回容器中元素的数目
    empty();//判断容器是否为空
    
    3.7.2.4 set插入和删除操作
    insert(elem);//在容器中插入元素
    clear();//清除所有元素
    erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器
    erase(beg,end);//删除区间   的所有元素,返回下一个元素的迭代器
    erase(elem);//删除容器中值为elem的元素
    
    */
    
    
    void printSet(set<int>&s) {
    	for(set<int>::iterator it=s.begin(); it!=s.end(); it++) {
    		cout<<*it<<" ";
    	}
    	cout<<endl;
    }
    
    void test01() {
    	set<int> s1;
    	//关联式容器  key进行排序 ,从小到大
    	s1.insert(5);
    	s1.insert(1);
    	s1.insert(9);
    	s1.insert(3);
    	s1.insert(7);
    	printSet(s1);
    
    	if(s1.empty() ) {
    		cout<<"空"<<endl;
    	} else {
    		cout<<"size="<<s1.size() <<endl;
    	}
    
    
    	s1.erase(s1.begin() );
    	printSet(s1);
    	s1.erase(3);
    	printSet(s1);
    }
    
    /*set 查找操作
    find(key);//查找键key是否存在,若存在,返回改键的元素的迭代器;若不存在 返回set.end()
    count(key);//查找键key的元素个数
    lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器
    upper_bound(keyElem);//返回第一的key>keyElem元素的迭代器
    equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器
    
    */
    
    void test02() {
    	set<int> s1;
    	s1.insert(5);
    	s1.insert(1);
    	//s1.insert(1);
    	s1.insert(9);
    	s1.insert(3);
    	s1.insert(7);
    	//对于set 没有value key就是value
    
    
    
    
    	set<int>::iterator pos= s1.find(2);
    	//判断是否找到
    	if(pos!=s1.end() ) {
    		cout<<"找到了,值为:"<<*pos <<endl;
    	} else {
    		cout<<"未找到"<<endl;
    	}
    
    	// count (key)结果0或者1
    
    	int num=s1.count(1);
    	cout<<"1的个数为:"<<num<<endl;
    
    
    
    
    
    
    	//lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器
    
    	set<int>::iterator it=s1.lower_bound(3);//10就是未找到
    	if(it!=s1.end() ) {
    		cout<<"找到了lower_bound(3)的值为:"<<*it<<endl;
    	} else {
    		cout<<"未找到"<<endl;
    	}
    
    
    
    
    
    
    
    	//upper_bound(keyElem);//返回第一的key>keyElem元素的迭代器
    	set<int>::iterator  it2=s1.upper_bound(3);
    	if(it2!=s1.end() ) {
    		cout<<"找到了upper_bound(3)的值为:"<<*it2<<endl;
    	} else {
    		cout<<"未找到"<<endl;
    	}
    
    
    
    
    
    
    //	 equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器
    	//上下限 就是 lower_bound   upper_bound
    	pair<set<int>::iterator,set<int>::iterator> ret = s1.equal_range(3);
    	//获取 第一个值
    	if(ret.first!=s1.end()) {
    		cout<<"找到equal_range中lower_bound的值:"<<*(ret.first)<<endl;
    	} else {
    		cout<<"未找到"<<endl;
    	}
    	//获取第二个值
    	if(ret.second!=s1.end()) {
    		cout<<"找到equal_range中upper_bound的值:"<<*(ret.second)<<endl;
    	} else {
    		cout<<"未找到"<<endl;
    	}
    
    }
    
    //set容器  不允许插入重复的键值
    void test03()
    {
    	set <int>s1;
    	pair<set<int>::iterator,bool>ret =s1.insert(10); 
    	
    	if(ret.second ){
    		cout<<"插入成功"<<endl;
    	}
    	else 
    	{
    		cout<<"插入失败"<<endl;
    	}
    
    	ret =s1.insert(10); 
    	
    	if(ret.second ){
    		cout<<"第二次插入成功"<<endl;
    	}
    	else 
    	{
    		cout<<"第二次插入失败"<<endl;
    	printSet(s1);	
    	} 
    } 
    
    //指定set排序规则 从大到小
    //仿函数  int属于基础数据类型 
    class myCompare{
    	
    public:
    	//重载()
    	bool operator ()(int v1,int v2)
    	{
    		return v1>v2;
    	 } 
    	
    }; 
    //set容器排序 
    void test04()
    {
    
    	set<int,myCompare>s1;
    	s1.insert(5);
    	s1.insert(1);
    	s1.insert(9);
    	s1.insert(3);
    	s1.insert(7);
    	
    //	printSet(s1);
    	
    	//从大到小排序
    	//在插入之前就指定排序规则
    	 
    	 for(set<int,myCompare>::iterator it=s1.begin() ;it!=s1.end() ;it++)
    	 {
    	 	cout<<*it<<" ";
    	 }
    	 cout<<endl;
    	
    	
    	myCompare my;
    	my(1,2);
    	
    }
    
    
    
    
    //自定义数据类型
    class Person{
    	public:
    		Person(string name,int age)
    		{
    			this->m_Name=name;
    			this->m_Age=age;
    		}
    		
    	string m_Name;
    	int m_Age;
    }; 
    
    class myComparePerson{
    	public:
    		bool operator()(const Person &p1,const Person &p2)
    		{
    			if(p1.m_Age>p2.m_Age)
    			//降序
    			{
    				return true; 
    			 } 
    			 return false;
    		}
    		
    };
    
    void test05()
    {
    	set<Person,myComparePerson>s1;
    	
    	Person p1("大娃",100);
    	Person p2("二娃",90);
    	Person p3("六娃",10);
    	Person p4("爷爷",1000);
    		
    	s1.insert(p1); 
    	s1.insert(p2); 
    	s1.insert(p3); 
    	s1.insert(p4); 
    	
    	//插入自定义数据类型,上来就制定好排序规则 
    	
    	//显示 
    	for(set<Person,myComparePerson>::iterator it=s1.begin() ;it!=s1.end() ;it++)
    	{
    		cout<<"name:"<<(*it).m_Name <<"age:"<<it->m_Age<<endl; 
    	}
    }
    
    
    
    
    
    
    
    int main() 
    {
    	//test01();
    
    //	test02();
    			
    	//test03();
    	
    //	test04();
    
    test05();
    
    }