精華區beta C_and_CPP 關於我們 聯絡資訊
※ 引述《eliang ()》之銘言: : 假設我設計了一個 class, 為了讓它能排序, : 所以讓它 overloading "小於" 運算子, 像這樣: : class foo { : public: : bool operator<(const foo& f) const; : //..... : }; 一般 operator< 是設計成 namespace 層次的函式,也就是 bool operator<(foo const &lhs, foo const &rhs); 這樣左值可以允許隱式轉型。 : 那我想把一堆 foo 的物件存在 STL 提供的 list 裡, : 但並不是直接存物件, 而是存它的 pointer, 像這樣: : list<foo*> fooList; : 請問我要怎麼利用 foo 所提供的 "小於" 運算子 : 來對 fooList 裡的東西作排序呢? : 如果這樣寫: : fooList.sort(); : 應該是行不通的吧! : 有沒有人能提供方法? 謝謝! 容器裏面如果放的是指標的話,直接呼叫 sort 是以指標的 < 關係來排 序(也就是它們在記憶體內的順序),這應該不是你想要的。 如果希望用 foo 的 operator< 來排序,可能要重載 bool operator<(foo const *lhs, foo const *rhs); 或是把你原來的 opeartor< 指定給 sort 函式,不過坦白說我沒看過這 種設計。 用 list 而不用 vector,表示非尾端的增刪操作較頻繁,但是標準程式 庫中,泛型演算法的 sort 需要 random access 層級的 iterator,所以 list 有提供它自己專屬的 sort。 不過,如果非尾端的增刪很頻繁,又需要排序的話,一般會傾向直接用關 聯式容器 set 或 map(或 multi 的版本)來裝,也就是隨時保持排序好 的狀態,因為 list 是 bidirectional iterator,常常 sort 很沒效率。 例如:set<foo> 或 map<Key, foo> 如果複製成本很大,或者要處理多型物件,或者有兩種以上的排序方法時 ,也可以放指標或 shared_ptr 之類的東東,意義差不多就相當於給物件 作索引,例如: multimap<Key, foo*> 或 multimap<Key, shared_ptr<foo> > -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.120.214.120