stl中各種容器的自定義比較函式

sunmenggmail發表於2012-04-26

class elem
{
public:
	elem();
	elem(int aa):a(aa){}
public:
	int a;
	int getA()
	{
		return a;
	}
};


class elem1
{
public:
	elem1();
	elem1(int aa):a(aa){}
public:
	int a;
	int getA()
	{
		return a;
	}

	friend bool operator < (const elem1 &e1,const elem1 &e2)//只能過載<
	{
		return e1.a <e2.a;//大頂堆是<;小頂堆是>
	}
};

class Scorer
{
public:
	bool operator ()(const elem &e1,const elem &e2)
	{
		return e1.a<e2.a;
	}
};
bool Cmp(const elem &e1,const elem &e2)
{
	return e1.a <e2.a;
}
int main()
{
	vector<elem> ve;
	ve.push_back(elem(5));
	ve.push_back(elem(6));
	ve.push_back(elem(7));
	ve.push_back(elem(1));
	ve.push_back(elem(0));
	ve.push_back(elem(19));
	ve.push_back(elem(60));
	ve.push_back(elem(61));
	ve.push_back(elem(2));
	ve.push_back(elem(68));
	ve.push_back(elem(9));

	list<elem> le;
	le.push_back(elem(5));
	le.push_back(elem(6));
	le.push_back(elem(7));
	le.push_back(elem(1));
	le.push_back(elem(0));
	le.push_back(elem(19));
	le.push_back(elem(6));
	
	priority_queue<int,vector<int>,less<int> > pq;//大頂堆//優先佇列如果用仿函式的形式,必須有三個引數
	pq.push(5);
	pq.push(6);
	pq.push(1);
	pq.push(2);
	pq.push(9);
	/*while (!pq.empty())
	{
		int t = pq.top();
		cout<<t<<" ";
		pq.pop();
	}*/
	
	priority_queue<elem,vector<elem>,Scorer > q;//1.自定義仿函式,也要有三個引數
	q.push(5);
	q.push(6);
	q.push(1);
	q.push(2);
	q.push(9);
	
	priority_queue<elem1> q1;//2.
	q1.push(5);
	q1.push(6);
	q1.push(1);
	q1.push(2);
	q1.push(9);

	set<int,less<int> > s;//從小到大
	s.insert(5);
	s.insert(6);
	s.insert(1);
	s.insert(3);
	s.insert(0);

	set<elem,Scorer> s1;

	s1.insert(5);
	s1.insert(6);
	s1.insert(1);
	s1.insert(3);
	s1.insert(0);
	set<elem,Scorer >::iterator it;
	for (it = s1.begin();it!=s1.end();++it)
	{
		cout<<it->getA()<<" ";
	}


	/*while(!q1.empty())
	{
		elem1 e = q1.top();
		cout<<e.getA()<<" ";
		q1.pop();
	}*/
	
	int array[] = {5,6,7,1,0,19,6};
	sort(array,array+7,greater<int>());//less<int>() 從小到大//說明greater,less和Scorer一樣都是類,而Cmp是函式;所以vector還是用Cmp形式的函式比較方便
	/*for (int i=0;i<7;++i)
	{
		cout<<array[i]<<" ";
	}
	cout<<endl;*/

	//sort(ve.begin(),ve.end(),Scorer());//sort(ve.begin(),ve.end(),Cmp);
	//partial_sort(ve.begin(),ve.begin()+3,ve.end(),Cmp);//對前三個排序
	nth_element(ve.begin(),ve.begin()+3,ve.end(),Cmp);//保證前三個最小,前三個不排序
	//sort(le.begin(),le.end(),Cmp);
	le.sort(Scorer());//Cmp//list的排序是要移動其內部指標的,所以只能用其內部的sort,而不能用通用的sort//也不能用nth_elements之類的排序
	
	
	/*vector<elem>::iterator it;
	for (it = ve.begin();it!=ve.end();++it)
	{
		cout<<it->getA()<<" ";
	}*/
	cout<<endl;


	
}

stl中各種容器的自定義比較函式的方法,vector,list,set相類似,要定義一個比較類,類裡面有比較成員函式 bool operator ()(const,const),並且return a<b 是從小到大排序

priority_queue有些不同,主要表現在return a<b是大頂堆


所有的共同之處是,都可以通過定義一個比較類實現排序




相關文章