※ 引述《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