STLの擬似関数ソート(1)


STLライブラリの研究を徐々に深める過程で,多くのパラメータに接触することは関数ポインタ形式である.例えばfor_each,sortなどのアルゴリズムでは,内蔵タイプに対して直接使用できる.私たちが自分の方法で実現したいとき、どうすればいいのでしょうか.まず、その内部のソースコードと説明を見てみましょう.1.for_each内部はtemplateに等しい
// 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/