2014-11-04 85 views
1

我試圖重載一個類的大於操作符(類似於我正面臨的一個真實情況)來對類成員映射進行排序。map <string,object>根據對象成員函數值排序

在這裏,我做了一個焦油球我的代碼:

http://s000.tinyupload.com/?file_id=81335448529630428273

MapSorting類有

std::map<std::string, std::vector<Electrons> > m_mymap; 

我在遞減順序使用Electron::pt()地圖排序興趣成員函數,如果我做

std::vector<Electrons> veto_electrons = m_mymap["Veto"]; 

然後veto_electrons[0]總是最高的電子pt

我大概可以寫一個仿函數來完成這個工作,但是,主要是作爲一個演習,我想盡可能地過載operator <

同樣會很高興從真正的程序員對我的代碼有一些反饋,我不是專業人士,但我喜歡並喜歡編程!

+0

'std :: map >' – 2014-11-04 18:18:59

+1

順便說一句,在tarball中提供代碼非常不方便。使用ideone.com或其他平臺,可以讓我們查看和測試它,而無需從互聯網上的陌生人下載隨機文件。 – StilesCrisis 2014-11-04 18:35:09

+1

沒有下載任何tarball,這聽起來像你正在嘗試使用錯誤的工具來完成這項工作。 'std :: map'只在插入時調用'operator <'。當重載'operator <'時,你需要提供一個一致的實現,即如果在時間t時a'<'b',那麼在時間t + n時'a'必須是<'b''。 – 2014-11-04 18:57:29

回答

2

如果要強制執行,在地圖中的元素進行排序,那麼最簡單的(從編寫代碼的角度來看,至少量)可能只是覆蓋在地圖中插入方法,只是使用它:

class my_map 
: public std::map<std::string, std::vector<Electrons> 
{ 
    // whatever constructors you need here 

    std::pair<iterator, bool> 
    insert(value_type vt) 
    { 
     // make sure the vector<Electrons> is sorted! 
     std::sort(vt.second.begin(), vt.second.end(), 
      [](const Electrons& a, const Electrons& b){ 
       return a.pt() > b.pt(); 
      }); 

     // then insert it 
     return std::map<std::string, std::vector<Electrons>>::insert(vt); 
    } 
}; 

現在很多人可能會認爲這是「不好的做法」,因爲std::map沒有提供虛擬析構函數,所以它不應該被繼承。所以不要將std::map<...>*動態初始化爲my_map。或者,你可以讓my_map有一個std::map<...>成員,並做同樣的事情 - 但這需要更多的打字,並基本上覆制整個界面。我會這樣做。

注意:我沒有覆蓋operator[]。所以不要用它來插入。

+0

Thanks @Barry我想我只是在將'vector'插入'map'前先訂購'vector'。我的理解是,在這種情況下它實際上不可能重載'operator <'',因爲'map'在插入時是有序的,因此我將不得不基本將它寫入'pairs of pairs','sort'和reverse到一個「地圖」! – drkg4b 2014-11-06 15:00:11

相關問題