作者khoguan (Khoguan Phuann)
看板C_and_CPP
标题Re: [问题] type compare
时间Mon Jun 13 02:37:39 2005
※ 引述《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
1F:→ khoguan:马上贴个简易版上来,请稍候220.130.208.166 06/13