一、需求:
現在需要用一個容器存放若干對象的指針(AObject*),對象指針在容器中的順序按照對象某個屬性(pObject->GetValue();)從低到高排序。
二、"解決"方法:
1. 使用std::set
set中的元素是按照一定的順序的存放的(根據元素的大小)。通過制定set的第二個模板參數就可以讓它按我們的要求順序排放。
先寫一個函數對象:
// object compare functor
class CompareObject

{
bool operator() (AObject* lhv, AObject* rhv)
{
return lhv->GetValue() < rhv->GetValue();
}
}
// decleare the object container;
typedef std::set<AObject*, CompareObject> AObjectContainer;AObjectContainer setContainer;
這種方法有啥問題?
(見文后)
2. 使用std::list
list中的元素默認不會排序,需要我們“手動”排序。
用list這樣聲明:
typedef std::list<AObject*> AObjectContainer;AObjectContainer listContainer;
添加完元素后,再排序:
(1)使用std::sort?
可注意了,std::list貌似不支持用std::sort進行用戶自定義排序,反正我是沒有試成功(有興趣的同學可以解釋一下)。假如這樣寫是錯誤的:
std::sort(listContainer.begin(), listContainer.end(), CompareObject());
(2)使用list.sort()
listContainer.sort(CompareObject());
三、分析
set中的元素是按序排列(此處是按object.GetValue()的大小排序,我們把這個值也叫key吧),注意的是set中不存在key值相等的元素。假如要插入的元素在set中已經存在會發生什么呢?是用新的元素替換原來的元素還是保留原來的元素呢?(有興趣有時間的同學幫忙做個實驗吧)但有一點可以肯定,有一個被遺失了。如果set中存放的是對象,還沒啥問題。但現在set中存放的是指針,于是內存便泄漏了。

