STL----set容器

1概念

  • set

    • 键值自动排序、
    • 键值唯一
    • set的迭代器不能改变set1的值 所以其迭代器就是只读迭代器
    • set和list一样 当对元素进行插入删除的操作之后 操作之前的所有迭代器都有效 被删除的元素除外
  • multiset

    • 可以有相同的key值
  • 两种的底层实现都是红黑树

2常用函数

2.1构造函数

在这里插入图片描述

2.2赋值函数

在这里插入图片描述

2.3大小

在这里插入图片描述

2.4 插入和删除

在这里插入图片描述

2.5 查找

在这里插入图片描述

2.6代码示意

#include<iostream>
#include<string>
#include<algorithm>
#include<math.h>
#include<set>
using namespace std;
void Printf(set<int>& s){
	for(set<int>::iterator it=s.begin();it!=s.end();it++){
		cout<<*it<<" ";
	}
	cout<<endl;
}
void test(){
	set<int> s;
	//插入元素只有
	s.insert(10);
	s.insert(40);
	s.insert(30);
	s.insert(50);
	s.insert(20);
	s.insert(60);
	
	
	s.erase(s.begin());
	s.erase(50);
	Printf(s);
}
void test02(){
	set<int> s;
	//插入元素只有
	s.insert(10);
	s.insert(40);
	s.insert(30);
	s.insert(50);
	s.insert(20);
	s.insert(60);
	
	//存在返回对应的迭代器 不存在 返回s.end()
	set<int>::iterator pos=s.find(30);
	if(pos!=s.end()){
		cout<<"找到l"<<endl;
P	}

	//统计 对于set而言 结果0或1;
	int num=s.count(10);

	
}
//对组的声明
void test03(){
	pair<string, int> p(string("Tom"),18);
	
	pair<string, int> p1=make_pair(string("Tom"),18);
	cout<<p1.first<<p1.second<<endl;
}
void test04(){
	set<int> s;
	pair<set<int>::iterator,bool> ret=s.insert(10);
	if(ret.second){
		cout<<"第一个插入成功"<<endl;
	}else{
		cout<<"第一个插入不成功"<<endl;
	}
	s.insert(10);
	if(ret.second){
		cout<<"第2个插入成功"<<endl;
	}else{
		cout<<"第2个插入不成功"<<endl;
	}

	multiset<int> ms;
	ms.insert(10);
	ms.insert(10);
	
}

3自定义类型插入set

3.1指定插入排序的规则

//利用仿函数来指定排序规则
class Mycompare{
public:
	bool operator()(int v1,int v2){
		return v1>v2;
	}


};
int test05(){

	//默认从小到大
	//因为模版里面只能放类型 不能放指针 所以不能放回调函数 所以只能采用仿函数的方法
	set<int,Mycompare> s;
	//插入元素只有
	s.insert(10);
	s.insert(40);
	s.insert(30);
	s.insert(50);
	s.insert(20);
	s.insert(60);

	for(set<int,Mycompare>::iterator it=s.begin();it!=s.end();it++){
		cout<<*it<<endl;
	}
}

3.2自定义类型插入set

class Person{
public:
	Person(string str,int a){
		name=str;
		age=a;
	}
	string name;
	int age;

};
class My_Person_compare{
public:
	//仿函数必须是const
	bool operator()(const Person& v1, const Person& v2){
		return v1.age >v2.age;
	}


};

void test06(){
	set<Person,My_Person_compare> s;
	//对于自定的类型 插入时一定要利用仿函数指定排序规则
	Person s1("aaaa",10);
	Person s2("bbbb",50);
	Person s3("cccc",30);
	Person s4("dddd",40);
	Person s5("eeee",20);
	
	s.insert(s1);
	s.insert(s2);
	s.insert(s3);
	s.insert(s4);
	s.insert(s5);
	for(set<Person,My_Person_compare>::iterator it=s.begin();it!=s.end();it++){
		cout<<(*it).name<<"    "<<(*it).age<<endl;
	}


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章