1. 程式人生 > 實用技巧 >關於c++中stl庫的sort模板的理解

關於c++中stl庫的sort模板的理解

今天浮於表面的研究了以下STL庫中sort方法,從新思考了以下sort方法中穿回調函式應該怎麼用數學方法理解

先來看一下形式

default (1)	
template <class RandomAccessIterator>
  void sort (RandomAccessIterator first, RandomAccessIterator last);
custom (2)	
template <class RandomAccessIterator, class Compare>
  void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

下面是具體程式碼

// sort algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>       // std::vector

bool myfunction (int i,int j) { return (i<j); }

struct myclass {
  bool operator() (int i,int j) { return (i<j);}
} myobject;

int 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 << '\n';

  return 0;
}

從上面的程式碼中可以看出傳入的回撥函式是一個bool返回值的,具體的細節我不清楚,原始碼的閱讀理解會在後續展開,但是就從快速使用上來說,如何理解這個回撥函式的意義?先來看看c++官網是如何解釋的:*Binary function that accepts two elements in the range as arguments, and returns a value convertible to bool. The value returned indicates whether the element passed as first argument is considered to go before the second in the specific strict weak ordering it defines.

(返回的值指示作為第一個引數傳遞的元素是否在其定義的特定嚴格弱順序中位於第二個引數之前)
The function shall not modify any of its arguments.
This can either be a function pointer or a function object.

其中重要的一句話是:
返回的值指示作為第一個引數傳遞的元素是否在其定義的特定嚴格弱順序中位於第二個引數之前
我可以理解為這個回撥函式其實是一個數學條件,我理解為sort是按照如此這般的方法去規範自己排序的依據,並且對所有的元素都應該是遵守這個依據的,如果兩個元素比較的時候沒有遵守這個依據,就交換位置

如何用數學語言去描述呢?

我比較喜歡用數學的方法去描述,這樣更簡單且方便理解一點。這個回撥函式其實可以描述成一個數學表示式:∀i,j,其中i!=j,都有 bool comp(i,j)== true
而對整個sort函式執行結構的數學描述則是:在陣列num中,i∈num,j∈num,i!=j,∀i,j,都有 bool comp(i,j)== true

總結

當用數學描述出來後會發現,相當的好理解,也好記憶了(也可能是我自己個人的感受),以後的演算法設計也可以按照這種想法來:先提出數學表示式,以此為目的,設計出符合自己目的的演算法來。從這裡我也理解出,演算法其實是實現目的的手段,而正真的難點是如何抽象你所需要實現的東西,當你抽象出來後,演算法的複用性可大大增加,否則會增加很多工作量。演算法是服務與人類的,演算法本身不美,美的是背後的思想,和偉大的人。