STL各種容器比較関数書き換え

4779 ワード

STL(Standard Template Library、標準テンプレートライブラリ)はC++標準の不可欠な一部であり、我々が普段からプログラムを書く上で非常に実用的なツールでもある.本稿では、ベクトル(vector)、スタック(stack)、キュー(queue)、優先キュー(priority queue)、マッピング(map)、集合を含むいくつかのSTLでよく使われるデータ構造の使い方を簡単にまとめた.(set)など、使用時のクイックリファレンスに供します.詳細はSTLマニュアルを参照してください.
1.ベクトル(vector).ヘッダファイル
void f()
{
	vector v;			// 
	vector v1(10);		//    
	vector v2(10, -1);	//    ,   
	int x[3] = {1, 2, 3};	vector v3(x, x+3); //     ,[st, ed)
	vector v4(v3);		//vector   

	v.empty();	v.size();	//    ,    
	v.push_back(100); v.pop_back();		//        
	for (int i = 0; i < v.size(); i++)	cout << v[i] << endl;		//    
	for(vector::iterator p = v.begin(); p != v.end(); p++) cout << *p << endl;	//     
}

2.スタック.ヘッダファイル.
void f()
{
	stack s;	//   
	s.push(100); s.pop();	//     
	s.top(); s.empty(); s.size();	//   ,   ,   
	while(!s.empty())	s.pop();	//   
}

3.キュー(queue).ヘッダファイル.
void f()
{
	queue q;	//   
	q.push(100); q.pop();		//     
	q.front(); q.back(); q.empty(); q.size();		//              
	while(!q.empty())	q.pop();	//    	
}

4.擬似関数(functor).ヘッダファイル.一部の操作はシミュレーション関数を用いて、簡単に紹介します.シミュレーション関数はoperator()を実現したクラスであり,関数の挙動をシミュレートすることができ,ここでは関係演算のシミュレーション関数にのみ関与する.
struct cmp{	bool operator()(const int& a, const int& b)	{return a > b;} };
void f()
{
	int a[5] = {1, 3, 2, 5, 4};
	sort(a, a+5);					//    
	//STL        equal_to not_equal_to greater greater_equal less less_equal
	sort(a, a+5, greater());	//    
	//        
	sort(a, a+5, cmp());			//    
}

5.優先キュー(prority queue).ヘッダファイル.
struct Node{ int x, y;	Node(int a = 0, int b = 0):x(a), y(b){}	};	//Node  
bool operator b.x;}		//  Node <
struct cmp{ bool operator()(const Node&a, const Node&b){return a.x > b.y;}};	//   
void f()
{
	priority_queue q;	//    ,   ,      
	priority_queue, greater > q1; //  ,   
	priority_queue q2; //     , cmp> q3; //     ,  ,   

	q.push(100); q.pop();			//     
	q.top(); q.empty(); q.size();	//           
	while(!q.empty())	q.pop();	//    	
}

6.マッピング(map).ヘッダファイル.
struct cmp{	bool operator()(const int& a, const int& b)	{return a > b;}};//   
void f()
{
	map m;		//   key   
	map m1;	//  cmp    
	m[1] = 2; m.insert(pair(1, 2)); m.insert(map::value_type(1, 2));//3     
	m.find(1);	//  ,ans==m.end()     ,  ans->first,ans->second  
	m[1];		//    (  1  )
	m.empty(); m.clear(); m.erase(p);	//           p    (    )
}

7.集合(set).ヘッダファイル.
struct Node{ int x, y;	Node(int a = 0, int b = 0):x(a), y(b){}	};	//Node  
struct cmp{ bool operator()(const Node&a, const Node&b){return a.x > b.y;}};	//   
void f()
{
	set s;					//        
	set > s1;	//      
	set s2(s);		set s3(st, ed); //    set   
	set s4;	//      ,    

	s.insert(100);	s.insert(p, 100); //  (    p     ),  pair,    ,    
	s.find(100); //  ,     p==s.end()
	s.erase(100);	s.erase(p);		s.erase(p1, p2);	//  
	s.empty();		s.clear();		s.size();	s.count(100);	//           
	for(p = s.begin(); p != s.end(); p++) cout << *p << endl; //  

	//    
	set a1; a1.insert(1); a1.insert(2);		
	set a2; a2.insert(2); a2.insert(3);
	vector rs;		vector::iterator pEnd;
	// 
	rs.resize(a1.size() + a2.size());
	pEnd = set_intersection(a1.begin(), a1.end(), a2.begin(), a2.end(), rs.begin());
	rs.resize(pEnd - rs.begin());
	// 
	rs.resize(a1.size() + a2.size());
	pEnd = set_union(a1.begin(), a1.end(), a2.begin(), a2.end(), rs.begin());
	rs.resize(pEnd - rs.begin());
	//  A-B:  A    B
	rs.resize(a1.size() + a2.size());
	pEnd = set_difference(a1.begin(), a1.end(), a2.begin(), a2.end(), rs.begin());
	rs.resize(pEnd - rs.begin());
	//    (A-B)U(B-A):  A B      A B
	rs.resize(a1.size() + a2.size());
	pEnd = set_symmetric_difference(a1.begin(), a1.end(), a2.begin(), a2.end(), rs.begin());
	rs.resize(pEnd - rs.begin());
}

9.ヒープ(heap).ヘッダファイル.
struct cmp{ bool operator()(const int& a, const int& b){ return a > b; } };
void print(vector v){ for (int i= 0; i < v.size(); i++) cout << v[i] << " ";cout< v;
	v.push_back(4); v.push_back(1); v.push_back(7);			print(v);	
	make_heap(v.begin(), v.end(), cmp());					print(v);//