[問題] template + c qsort

看板C_and_CPP作者 (ㄆㄆ)時間13年前 (2012/12/24 22:56), 編輯推噓0(0018)
留言18則, 2人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) g++ 問題(Question): 請問使用template implement的 linked list 要對它的element做 sort的時候(裡面使用 qsort) 過程大概就是 scan整個list一次 做一個 array or pointer ex: LinkList<T>::sort(int(*_cmp)(const void *a, const void *b)) { m_exactly_cmp = _cmp; T **src = new T*[list_size]; Node<T> *ptr = m_head; size_t i = 0; for(i = 0; ptr != NULL; ptr = ptr=>next) src[i] = ptr; ... } 然後想法是... 自己在使用者定義的 compare function _cmp int _cmp(string &a, string &b) { return a.compare(b); } 外面再加一層 warp做 dereference 想要做這樣的事情 template <typename T> int LinkList<T>::warp_cmp (const void *a, const void * b) { T _a = (*(Node<T> **)a)->data; T _b = (*(Node<T> **)b)->data; return m_exactly_cmp(_a, _b); } 然後call qsort qsort(src, listSize, sizeof(Node<T> *), warp_cmp); 錯誤結果(Wrong Output): 編譯不會過 XD 因為... warp 是 int (Obj::)(const void *, const void *) 不是 int (*)(const void *, const void *) 請問在C++ template下面 想call cstdlib的 qsort "中間要加一層 warp" 是辦的到的嗎...? 還沒找到好的解法... -- 也試過用 static member function for warp_cmp 不過_exactly_cmp 那邊assign也有問題... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.162.60.58 ※ 編輯: EntHeEnd 來自: 1.162.60.58 (12/24 22:57) ※ 編輯: EntHeEnd 來自: 1.162.60.58 (12/24 22:59)

12/24 23:04, , 1F
what's the type of m_exactly_cmp?
12/24 23:04, 1F

12/24 23:04, , 2F
int(*_exactly_cmp)(const void *, const void *)
12/24 23:04, 2F

12/24 23:05, , 3F
然後是 LinkList class的member data...
12/24 23:05, 3F

12/24 23:05, , 4F
int(*m_exactly_cmp)(const void *, const void *)
12/24 23:05, 4F

12/24 23:06, , 5F
這樣才對
12/24 23:06, 5F
※ 編輯: EntHeEnd 來自: 1.162.60.58 (12/24 23:07) ※ 編輯: EntHeEnd 來自: 1.162.60.58 (12/24 23:07) ※ 編輯: EntHeEnd 來自: 1.162.60.58 (12/24 23:08)

12/24 23:09, , 6F
declare m_exactly_cmp as int(*)(T&,T&)
12/24 23:09, 6F

12/24 23:10, , 7F
int(*)(T const&,T const&) is better
12/24 23:10, 7F

12/24 23:15, , 8F
assing _cmp的時後就會出問題了(不這樣寫就有問題了...)
12/24 23:15, 8F

12/24 23:16, , 9F
會說int(obj<data type>::)(xxx) is not int(*)(xxx)這樣
12/24 23:16, 9F

12/24 23:43, , 10F
qsort吃的function限定要int(*)(const void *, const ..)
12/24 23:43, 10F

12/25 02:36, , 11F
warp_cmp 那邊要能存取 data member 就不能是 static
12/25 02:36, 11F

12/25 02:37, , 12F
method, 但是又必須要是靜態的才能符合 qsort 的要求
12/25 02:37, 12F

12/25 02:39, , 13F
如果還在c++98的話就直接用std::sort()作掉了吧, 第三
12/25 02:39, 13F

12/25 02:40, , 14F
個引數就可以丟functor進去
12/25 02:40, 14F

12/25 02:59, , 15F
12/25 02:59, 15F

12/25 03:01, , 16F
不過我還是建議你直接用 std::list<T>...
12/25 03:01, 16F

12/25 03:01, , 17F
12/25 03:01, 17F

12/25 22:08, , 18F
恩... 謝謝回答! 因為在練習用qsort想說辦不辦的到...XD
12/25 22:08, 18F
文章代碼(AID): #1Gs6qNOT (C_and_CPP)