Re: [問題] type compare
※ 引述《chun0826 (蛋頭 ︩》之銘言:
: ※ 引述《khoguan (Khoguan Phuann)》之銘言:
: : 是的。list 中的 sort() 有兩個,一個不需參數的就是
: : aecho哥講的那樣使用就對了,很簡單。另一個要參數的,
: : 就比較複雜,我寫了一個完整的程式供參考:
: : // user-defined function object for comparison
: : #include <iostream>
: : #include <list>
: : #include <iterator>
: : using namespace std;
: : class MyObj {
: : public:
: : MyObj(int i=0) : data(i) {}
: : bool comp(const MyObj& other) const { // 假設所用的比較函式名為 comp
: : if (this->data < other.data) return true;
: : else return false;
: : }
: : friend ostream& operator<< (ostream& os, const MyObj& my);
: : private:
: : int data;
: : };
: : ostream& operator<< (ostream& os, const MyObj& my)
: : {
: : return os << my.data;
: : }
: : // 以下是重點
: 這段可以解釋一下嗎..
: 還有位什們要有這一段..
: 目的為何..
就是為了要產生 function object 給 list 的 sort 用。
如果沒有 functio object 的概念,要說明這段程式的寫作技巧,
老實說不是簡單幾句能夠講完的。也許要面對面教幾個小時吧。
: 這一段應該不是我照抄就可以解決的吧..
如果你上面的比較函式是這樣宣告:
bool comp(const MyObj& other) const;
不管函式名稱(comp),只管傳回的 type 是 bool, 參數的 type 也是
const T& 那個 T 要是這個 class 的名字,而接著後面也要有 const.
也就是 const member function, 那麼下面這段就可以照抄。
當然最後面實際呼叫 sort 時,所用的參數要用對 class 及 function
名稱。
: : template <typename T>
: : class compf {
: : bool (T::*pcomp)(const T&) const;
: : public:
: : explicit compf(bool (T::*p)(const T&) const) : pcomp(p) {}
: : bool operator()(const T& t1, const T& t2) {
: : return (t1.*pcomp)(t2);
: : }
: : };
: : template <typename T>
: : compf<T> mem_comp(bool (T::*p)(const T&) const) {
: : return compf<T>(p);
: : }
: : int main()
: : {
: : list<MyObj> mylist;
: : for (int i = 9; i >= 1; --i)
: : mylist.push_back(MyObj(i)); // 放進 9 個元素做測試用
: : mylist.sort(mem_comp(&MyObj::comp)); // 注意寫法!
: : // 正確印出排序後的結果
: : copy(mylist.begin(), mylist.end(), ostream_iterator<MyObj>(cout, "\n");
: : }
: : 可參考 The C++ Programming Language, chap. 18
: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
: 可以給一下作者嗎..
這是 C++ 的創造者 Bjarne Stroustrup 寫的 C++ 聖經。第三版
葉秉哲有中譯,評價極好。或者參考侯捷譯的 C++ Primer 第三版,
可是這書英文版第四版已經出了。新版中譯可能要再等一陣子。
: : 或是專門講 STL 的書。
也可參考「C++ 標準程式庫」一書,侯捷中譯。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.130.208.166
→
220.130.208.166 06/13, , 1F
220.130.208.166 06/13, 1F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章