2015-06-30 61 views
0

我的影片由以下宣佈的地圖:地圖比較值

std::map<std::string, std::map<std::string, std::string>> groupList; 

我想使用子地圖內的值(主圖在這種情況下,「順序」排序。例如,如果地圖看起來像這樣原本(鍵是一樣的組ID):

(
    [1] => 
     (
      [groupID] => 1 
      [sequence] => 0 
      [command] => DefaultState 
     ) 

    [2] => 
     (
      [groupID] => 2 
      [sequence] => 2 
      [command] => Restart 
     ) 

    [3] => 
     (
      [groupID] => 3 
      [sequence] => 1 
      [command] => Beep 
     ) 

) 

我想用這個比較之後的結果看起來像這樣:

(
    [1] => 
     (
      [groupID] => 1 
      [sequence] => 0 
      [command] => DefaultState 
     ) 

    [3] => 
     (
      [groupID] => 3 
      [sequence] => 1 
      [command] => Beep 
     ) 

    [2] => 
     (
      [groupID] => 2 
      [sequence] => 2 
      [command] => Restart 
     ) 

) 

我曾經提過一個類似的問題,但沒有針對在定義地圖時使用比較函數。解決我的其他問題涉及到使用Boost庫和表。我想保持這個非常簡單,並使用我上面的定義。

不同的選擇將使用序列值作爲父映射的關鍵,可以完成,但我想用它作爲最後一個選項。地圖的順序不可更改嗎?我對C++的這種思維很陌生,因爲我很新,很難從更新的語言中獲得,因爲這樣的語言更容易一些。

在此先感謝。

+3

你應該放棄你的PHP視圖和模型C++數據結構 –

+0

@DieterLücking我知道,你是對的,但是它比聽起來要困難得多。我在做這個工作。如何在紙上模擬地圖? –

回答

0

儘管技術上可以根據價值而不是關鍵字對std::map進行排序,但我強烈建議不要這樣做,因爲這會導致錯誤並且很難支持代碼。 std::map的關鍵是不可變的,它遵循std::map設計,如果你使用比較器的價值和修改它,你會得到不可預知的行爲。您可以使用std::set代替:

typedef std::map<std::string,std::string> Group; 
struct GroupComp { 
    bool operator()(const Group &g1, const Group G2) const { ... } 
}; 
typedef std::set<Group, GroupComp> GroupList; 

GroupGroupList仍將是不變的,所以要修改的元素,你將不得不刪除並重新插入修改後的副本。如果這不是你想要的,你可能可以將Group存儲在std::vectorstd::list等,並建立一個外部索引 - 實際上在boost::multi_index下做了什麼。

1

我同意@Slava對此目的不使用地圖。

我的建議是使用一個簡單的矢量,並根據不同的規則進行排序。事情是這樣的:

std::vector<std::tuple<std::string, std::string, std::string>> GroupList ; 

GroupList glist ; 
std::sort(glist.begin(), glist.end(), mysort<0>) ; 

其中

template <int N> 
bool mysort(const std::tuple<std::string, std::string, std::string> &lhs, 
      const std::tuple<std::string, std::string, std::string> &rhs) 
{ 
    return std::get<N>(lhs) < std::get<N>(rhs.get) ; 
} 

然後你就可以快速,根據如需要時,重新梳理矢量獲得通過的std :: LOWER_BOUND訪問對象的n個向量mysort<1>