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


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