std :: map按值大小排序(set <int>)</int>

时间:2015-01-23 05:45:57

标签: c++ sorting dictionary set size

使用C ++,我有一个带有int键和设置值的映射。我想根据集合的大小(即value.size())对输出的地图进行排序。我知道地图会根据密钥自动排序。有没有办法让地图按其值中的元素数排序?此外,如果我按照某些帖子的建议翻转地图,并且键设置了,地图如何确定排序顺序?任何帮助理解这一点将非常感激。

mymap<int, set<int> >;
/* code to fill map */
/* How to sort by mymap[node].second().size() ??? */

2 个答案:

答案 0 :(得分:1)

您无法更改现有map的排序顺序。

说明以排序map ...

的形式创建vector索引的一种方法
std::vector<std::pair<int, int>> size_key;

for (auto& x : mymap)
    size_key.emplace_back(x.second.size(), x.first);
std::sort(std::begin(size_index), std::end(size_index));

// work's done above - just display the results to illustrate access...

for (auto& sk : size_key)
{
    std::cout << "with size " << sk.first
              << ", value " << mymap[sk.second].first << '\n';
    for (auto& n : mymap[sk.second].second)
         std::cout << "  " << n << '\n'
}
  

另外,如果我翻转地图,就像有些帖子所说的那样......

不是一个好主意:只是&#34;翻转&#34;如果不更改排序比较器,键和值就会有所帮助,如果multimap大小可以重复,则需要set,并且比构建索引更慢,更浪费内存如上所述(除非您在构建重新排序的mymap后可以丢弃原始multimap)。

答案 1 :(得分:0)

你只想以某种奇怪的排序顺序输出地图。

您不应该想要修改std::map内部的键顺序(这没有任何意义,因为固定顺序 - 键比较功能 - 是std::map的第二个模板参数)。

因此,请从std::vector

获取std::map个密钥
std::vector<int> keyvec;
keyvec.reserve(mymap.size());
for (auto&x : mymap)
  keyvec.push_back(x.first);

然后根据您的标准对(使用std::stable_sort按原始顺序保留相同大小的键)进行排序

std::stable_sort(keyvec.begin(), keyvec.end(),
                 [&mymap,=](int k1, int k2) 
                 { return mymap[k1].size() < mymap[k2].size(); });

最后使用

显示您的地图
for (auto k: keyvec)
   std::cout << "[" << k << "]:" << mymap[k] << std::endl;