STLアダプタadapter
14385 ワード
文書ディレクトリ前言 一.関数アダプタbind 1 nd、bind 2 nd 二.容器アダプタ 前言
私达は日常生活の中でコンピュータに充电しなければならなくて、コンピュータの时直接强大な电圧に耐えることができなくて、だから私达は1つのアダプタを使って电圧を変换して、私达のコンピュータにアダプタを通じて充电することができます.C++STLでは、すでに規定されているテンプレートを使用したいのですが、このテンプレートはいくつかの変換をして使用する必要があります.これにより、アダプタが登場します.以下主に関数アダプタbind 1 nd、bind 2 nd コンテナアダプタstack,queue,priority_queue
一.関数アダプタbind 1 nd、bind 2 nd
ある関数を使用したい場合、この関数が私たちの使用要件に完全に合致していない場合は、関数アダプタbind 1 st,bind 2 ndを使用して、私たちが使用したい関数を返す必要があります.
またbindの使い方が多すぎて、別の文章を参考にします:bind関数アダプタ、bindコールバックを利用して継承のないマルチステートを実現して、men_fnメンバー関数を関数オブジェクトに変換する
二.容器アダプタ
stack、queue、priority_queueはいずれもコンテナアダプタstackとqueueの標準テンプレートがdequeであり、stackとqueueは実装されたdequeの一部の機能に相当し、関数を書き直す必要がないため、コンテナアダプタpriority_Queueの標準テンプレートはvectorであるが,優先キューの論理実装は最大スタック,最小スタックと一致し,下位層は依然として二叉スタックで実現される.
私达は日常生活の中でコンピュータに充电しなければならなくて、コンピュータの时直接强大な电圧に耐えることができなくて、だから私达は1つのアダプタを使って电圧を変换して、私达のコンピュータにアダプタを通じて充电することができます.C++STLでは、すでに規定されているテンプレートを使用したいのですが、このテンプレートはいくつかの変換をして使用する必要があります.これにより、アダプタが登場します.以下主に
一.関数アダプタbind 1 nd、bind 2 nd
ある関数を使用したい場合、この関数が私たちの使用要件に完全に合致していない場合は、関数アダプタbind 1 st,bind 2 ndを使用して、私たちが使用したい関数を返す必要があります.
またbindの使い方が多すぎて、別の文章を参考にします:bind関数アダプタ、bindコールバックを利用して継承のないマルチステートを実現して、men_fnメンバー関数を関数オブジェクトに変換する
struct pred:public binary_function<int, int, bool>{
bool operator()(const int& lhs, const int& rhs)const{
if (lhs >= rhs){
cout << lhs << endl;
return true;
}
return false;
}
};
// , vector >=5 ,
void test1(){
vector<int> vec{1,3,5,6,7,8};
for_each(vec.begin(), vec.end(), bind2nd(pred(), 5));
}
// , vector >=5
void test2(){
vector<int> vec{1,3,5,6,7,8};
vec.erase(remove_if(vec.begin(), vec.end(), bind2nd(std::greater_equal<int>(), 5)), vec.end());
for (auto& e : vec)
cout << e << endl;
}
二.容器アダプタ
stack、queue、priority_queueはいずれもコンテナアダプタstackとqueueの標準テンプレートがdequeであり、stackとqueueは実装されたdequeの一部の機能に相当し、関数を書き直す必要がないため、コンテナアダプタpriority_Queueの標準テンプレートはvectorであるが,優先キューの論理実装は最大スタック,最小スタックと一致し,下位層は依然として二叉スタックで実現される.
class Point{
public:
Point(int x, int y)
:_x(x)
,_y(y)
{
_sum = x + y;
}
int _x;
int _y;
int _sum;
friend ostream& operator<<(ostream& os, const Point& lhs);
};
ostream& operator<<(ostream& os, const Point& lhs){
os << lhs._sum;
return os;
}
struct myCompare{
bool operator()(const Point& lhs, const Point& rhs){
return lhs._sum > rhs._sum;
}
};
void test3(){
priority_queue<Point, vector<Point>, myCompare> myque;
myque.push(Point(1,1));
myque.push(Point(2,2));
myque.push(Point(3,3));
while (!myque.empty()){
cout << "Now the highest priority is :" << myque.top() << endl;
myque.pop();
}
}
int main(){
test3();
return 0;
}