STLの擬似関数ソート(1)
9676 ワード
STLライブラリの研究を徐々に深める過程で,多くのパラメータに接触することは関数ポインタ形式である.例えばfor_each,sortなどのアルゴリズムでは,内蔵タイプに対して直接使用できる.私たちが自分の方法で実現したいとき、どうすればいいのでしょうか.まず、その内部のソースコードと説明を見てみましょう.1.for_each内部はtemplateに等しい
もう一度for_each()キー:関数の場合、戻り値とパラメータタイプが一致するようにします.クラスの場合、オペレータ()を再ロードします.
終わりましたfor_each,次の課題,sort()関数を行う.sort()関数はSTLが我々に提供するものであり,リレーショナルコンテナでは底層は赤黒ツリーに基づいて実現され,sortを使用する必要はないがシーケンスコンテナである.内蔵タイプではsortの使用方法の原理も少なく,異なるパラメータの個数に対しては,比較に2つのパラメータが必要である.まず、組み込みタイプの例を示します.
クラスや構造体のメンバーを比較対象にするなど、カスタム比較を実現するにはどうすればいいのでしょうか.賢い読者は、クラスに対して、
参考文献:1.http://www.cppblog.com/changshoumeng/articles/114379.html 2. http://www.cplusplus.com/
// for_each example
#include // std::cout
#include // std::for_each
#include // std::vector
void myfunction (int i) { // function:
std::cout << ' ' << i;
}
struct myclass { // function object type:
void operator() (int i) {std::cout << ' ' << i;}
} myobject;
int main () {
std::vector<int> myvector;
myvector.push_back(10);
myvector.push_back(20);
myvector.push_back(30);
std::cout << "myvector contains:";
for_each (myvector.begin(), myvector.end(), myfunction);
std::cout << '
';
// or:
std::cout << "myvector contains:";
for_each (myvector.begin(), myvector.end(), myobject);
std::cout << '
';
return 0;
}
Output:
myvector contains: 10 20 30
myvector contains: 10 20 30
もう一度for_each()キー:関数の場合、戻り値とパラメータタイプが一致するようにします.クラスの場合、オペレータ()を再ロードします.
終わりましたfor_each,次の課題,sort()関数を行う.sort()関数はSTLが我々に提供するものであり,リレーショナルコンテナでは底層は赤黒ツリーに基づいて実現され,sortを使用する必要はないがシーケンスコンテナである.内蔵タイプではsortの使用方法の原理も少なく,異なるパラメータの個数に対しては,比較に2つのパラメータが必要である.まず、組み込みタイプの例を示します.
// sort algorithm example
#include // std::cout
#include // std::sort
#include // std::vector
bool myfunction (int i,int j) { return (istruct myclass {
bool operator() (int i,int j) { return (iint main () {
int myints[] = {32,71,12,45,26,80,53,33};
std::vector<int> myvector (myints, myints+8); // 32 71 12 45 26 80 53 33
// using default comparison (operator
std::sort (myvector.begin(), myvector.begin()+4); //(12 32 45 71)26 80 53 33
// using function as comp
std::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)
// using object as comp
std::sort (myvector.begin(), myvector.end(), myobject); //(12 26 32 33 45 53 71 80)
// print out content:
std::cout << "myvector contains:";
for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '
';
return 0;
}
クラスや構造体のメンバーを比較対象にするなど、カスタム比較を実現するにはどうすればいいのでしょうか.賢い読者は、クラスに対して、
#include
#include
#include
#include
using namespace std;
class myclass {
public:
myclass(int a, int b):first(a), second(b){}
int first;
int second;
bool operator < (const myclass &m)const {
return first < m.first;
}
};
bool less_second(const myclass & m1, const myclass & m2) {
return m1.second < m2.second;
}
int main() {
vector< myclass > vect;
for(int i = 0 ; i < 10 ; i ++){
myclass my(10-i, i*3);
vect.push_back(my);
}
for(int i = 0 ; i < vect.size(); i ++)
cout<<"("<","<")
";
sort(vect.begin(), vect.end());
cout<<"after sorted by first:"<for(int i = 0 ; i < vect.size(); i ++)
cout<<"("<","<")
";
cout<<"after sorted by second:"<for(int i = 0 ; i < vect.size(); i ++)
cout<<"("<","<")
";
return 0 ;
}
参考文献:1.http://www.cppblog.com/changshoumeng/articles/114379.html 2. http://www.cplusplus.com/