1. 程式人生 > >C++ STL 有關於SET集合部分 的自定義資料型別的排序 以及 pair的使用

C++ STL 有關於SET集合部分 的自定義資料型別的排序 以及 pair的使用

#include<iostream>
using namespace std;
#include"set"  //set集合容器的標頭檔案
#include<functional>  //用於識別set從大到小中greater的識別
/*知識點集合*/

//1 set為容器 元素唯一(如果插入多個重複元素就會出現只有一個元素被插入) 自動排序(預設情況下 從小到大) 不可以按照[](陣列形式)方式插入元素
//理論基礎是 紅黑樹  平衡二叉樹
// 在less<> 與 greater<> 為庫中提前預定好的函式物件
//在學習的時候 一定要注意如果出現對某個函式有疑問 一定要學會對該函式的原始碼追蹤


//set 的基本操作  初始化以及刪除操作
void main91()
{
	set<int>  s1;

	cout << "set的長度" << s1.size() << endl;


	//首先插入五個隨機數
	for (int i = 0; i < 5; i++)
	{
		int temp = rand();   //隨機數
		s1.insert(temp);  //set的插入
	}

	cout << "set的長度" << s1.size() << endl;
	set<int>::iterator it = s1.begin();
	cout << "set的初始化" << endl;
	while (it != s1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

	//在插入三個相同的數  驗證是否會保證元素的唯一性

	s1.insert(10);
	s1.insert(10);
	s1.insert(10);

	cout << "set的插入相同元素之後" << endl;
	it = s1.begin();

	while (it != s1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << "set的長度" << s1.size() << endl;
	cout << endl;

	cout << "set的刪除元素之後" << endl;
	it = s1.begin();

	while (!s1.empty())
	{
		it = s1.begin();
		cout << *it << " ";
		//刪除操作
		s1.erase(s1.begin());  //按位置刪除
	}


	cout << endl;

	cout << "set的長度" << s1.size() << endl;

}

//基本資料型別情況下 有關於set自動排序從大到小以及從小到大的深究
void main92()
{
	set<int> s1;   //預設情況從小到大
	set<int, less<int>> s2;  //從小到大的規範寫法
	set<int, greater<int>> s3;  //從大到小的寫法

	//首先插入五個隨機數
	for (int i = 0; i < 5; i++)
	{
		int temp = rand();   //隨機數
		s1.insert(temp);
		s2.insert(temp);
		s3.insert(temp);
	}

	set<int>::iterator it = s1.begin();   //預設情況下的迭代器
	cout << "預設情況下的set:" ;
	while (it != s1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

	set<int,less<int>>::iterator it1 = s2.begin();   //從小到大規範寫法情況下的迭代器
	cout << "從小到大規範寫法情況下的set:";
	while (it1 != s2.end())
	{
		cout << *it1 << " ";
		it1++;
	}
	cout << endl;

	set<int, greater<int>>::iterator it2 = s3.begin();   //從大到小規範寫法情況下的迭代器
	cout << "從大到小規範寫法情況下的set:";
	while (it2 != s3.end())
	{
		cout << *it2 << " ";
		it2++;
	}
	cout << endl;

}

//複雜資料型別情況的排序  例如Student類

//涉及到自定義資料型別的排序  ----->仿函式

class Student{
public:
	Student(char * name,int age)
	{
		strcpy(this->name, name);
		this->age = age;
	}
public:
	char name[128];
	int age;
};


//仿函式的構成  結構體的形式
struct FuncStudent{

	bool operator()(const Student &left, const Student &right)  //對於()的過載
	{
		if (left.age < right.age)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
};


//仿函式的基本用法
void main93()
{
	Student s1("s1",11), s2("s2",6), s3("s3",44), s4("s4",17);

	set<Student,FuncStudent> set1;

	set1.insert(s1);
	set1.insert(s2);
	set1.insert(s3);
	set1.insert(s4);

	//遍歷

	for (set<Student, FuncStudent>::iterator it = set1.begin(); it != set1.end(); it++)
	{
		cout << it->age << "   " << it->name << endl;    
	}


	
	
}

//涉及到insert()的返回值  pair的概念  對組

void main94()
{

	Student s1("s1", 11), s2("s2", 6), s3("s3", 44), s4("s4", 17),s5("s5",11);

	set<Student, FuncStudent> set1;


	pair<set<Student, FuncStudent>::iterator,bool> pair1 = set1.insert(s1);
	if (pair1.second == true)
	{
		cout << "s1插入成功" << endl;
	}
	else
	{
		cout << "s1插入失敗" << endl;
	}
	
	set1.insert(s2);
	set1.insert(s3);
	set1.insert(s4);

	//因為set集合具有一個唯一性,因此每次插入元素可以根據返回值 驗證是否插入成功
	pair<set<Student, FuncStudent>::iterator, bool> pair5 = set1.insert(s5); 
	if (pair5.second == true)
	{
		cout << "s5插入成功" << endl;
	}
	else
	{
		cout << "s5插入失敗" << endl;
	} 

	//遍歷

	for (set<Student, FuncStudent>::iterator it = set1.begin(); it != set1.end(); it++)
	{
		cout << it->age << "   " << it->name << endl;
	}

}
int main()
{
	//main91();   //set 的基本操作  初始化以及刪除操作
	//main92();  //基本資料型別情況下 有關於set自動排序從大到小以及從小到大的深究
	//main93();//仿函式的基本用法
	main94(); //涉及到insert()的返回值 pair的概念  對組
	system("pause");
	return 0;
}