STL各種容器比較関数書き換え
4779 ワード
STL(Standard Template Library、標準テンプレートライブラリ)はC++標準の不可欠な一部であり、我々が普段からプログラムを書く上で非常に実用的なツールでもある.本稿では、ベクトル(vector)、スタック(stack)、キュー(queue)、優先キュー(priority queue)、マッピング(map)、集合を含むいくつかのSTLでよく使われるデータ構造の使い方を簡単にまとめた.(set)など、使用時のクイックリファレンスに供します.詳細はSTLマニュアルを参照してください.
1.ベクトル(vector).ヘッダファイル
2.スタック.ヘッダファイル.
3.キュー(queue).ヘッダファイル.
4.擬似関数(functor).ヘッダファイル.一部の操作はシミュレーション関数を用いて、簡単に紹介します.シミュレーション関数はoperator()を実現したクラスであり,関数の挙動をシミュレートすることができ,ここでは関係演算のシミュレーション関数にのみ関与する.
5.優先キュー(prority queue).ヘッダファイル.
6.マッピング(map).ヘッダファイル.
7.集合(set).ヘッダファイル.
9.ヒープ(heap).ヘッダファイル.
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);//