2016-11-15 77 views
1

我有整数排序映射在关键的优先级的指定顺序

std::map<string,int> map1; 

map1["ymax"]=10; 
map1["ymin"]=16; 
map1["xval"]=10; 

std::map<string,int> map2; 

map2["ymax"]=16; 
map2["ymin"]=20; 
map2["xval"]=28; 

std::map<string,int> map3; 

map3["ymax"]=16; 
map3["ymin"]=20; 
map3["xval"]=10; 

的三张地图和地图包含此映射

std::map<string,std::map<string,int>> almap; 

allmap["map1"]=map1; 
allmap["map2"]=map2; 
allmap["map3"]=map3; 

我想最后的地图作为重点排序ymin在内的地图,但如果留在大地图等地图我要排序的一个关键xval那么作为关键ymax,同样的想法

正确的类来allmap >> map1,map3,map2

+0

'如果仍然等于地图'如果什么等于地图? –

回答

0

所有地图的创建载体,通过tie荷兰国际集团钥匙在关键的规定的优先权的顺序进行排序:

vector<map<string,int>> v{map1, map2, map3}; 

std::sort(v.begin(), v.end(), [](std::map<string,int> &lhs, std::map<string,int> &rhs){ 
           return tie(lhs["ymax"], lhs["ymin"], lhs["xval"]) < 
             tie(rhs["ymax"], rhs["ymin"], rhs["xval"]);} 
     ); 

Live Demo

0

对于教育的目的...

std::map要求在键/值对,关键是不变的。它还要求密钥充分描述了顺序。

allmap的情况下,提供的密钥为std::string,即使具有复杂的自定义比较函数,该地图也必须继续。

为了允许任何类型的排序,我们需要将外部名称和它们所代表的地图一起滚动到一个关键对象中,并对其进行排序。

这开始主张要么使用一组对象(因为现在没有关联的数据),要么保留一个单独的,排序的按键索引,按照我们的自定义谓词进行排序。

这里是后者:

#include <string> 
#include <map> 
#include <set> 
#include <vector> 
#include <utility> 
#include <algorithm> 

struct by_keys 
{ 
    template<class...Keys> 
    by_keys(std::map<std::string, std::map<std::string, int>> const& allmap, Keys&&...keys) 
    : keys_ { std::forward<Keys>(keys)... } 
    , allmap_(allmap) 
    { 
    } 

    bool operator()(const std::string& ls, const std::string& rs) const 
    { 
    auto& l = allmap_.find(ls)->second; 
    auto& r = allmap_.find(rs)->second; 
    for (auto& key : keys_) 
    { 
     auto const& il = l.find(key); 
     auto const& ir = r.find(key); 
     if (il == std::end(l) && ir == std::end(r)) return false; 
     if (il == std::end(l) && ir != std::end(r)) return true; 
     if (il != std::end(l) && ir == std::end(r)) return false; 
     if (*il < *ir) return true; 
     if (*ir < *il) return false; 
    } 
    return false; 
    } 

    std::vector<std::string> keys_; 
    std::map<std::string, std::map<std::string, int>> const& allmap_; 
}; 

int main() 
{ 
std::map<std::string,int> map1; 

map1["ymax"]=10; 
map1["ymin"]=16; 
map1["xval"]=10; 

std::map<std::string,int> map2; 

map2["ymax"]=16; 
map2["ymin"]=20; 
map2["xval"]=28; 

std::map<std::string,int> map3; 

map3["ymax"]=16; 
map3["ymin"]=20; 
map3["xval"]=10; 

std::map<std::string,std::map<std::string,int>> allmap; 

allmap["map1"]=map1; 
allmap["map2"]=map2; 
allmap["map3"]=map3; 

    // ok, now lets make an index into this map 

    std::vector<std::string> sorted_keys; 
    for (auto& entry : allmap) { sorted_keys.push_back(entry.first); } 
    std::sort(std::begin(sorted_keys), std::end(sorted_keys), 
      by_keys(allmap, "ymin", "xval", "ymax")); 

    // sorted_keys should now contain the names "map1", "map3", "map2" 
}