std::map 按值的大小排序(设置<int>)

std::map sort by size of value (set<int>)

使用 C++,我有一个带有 int 键和设置值的映射。我想根据集合的大小(即 value.size())对输出地图进行排序。我知道地图会根据键自动对自己进行排序。有什么方法可以使地图按其值中的元素数量排序吗?另外,如果我翻转地图,正如某些帖子所建议的那样,并且设置了键,地图如何确定排序顺序?如果能帮助理解这一点,我们将不胜感激。

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

您不能更改现有 map 的排序顺序。

说明一种以排序 vector...

的形式在 map 中创建索引的方法
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'
}

Also, if I flip the map, as some posts suggest...

不是个好主意:如果不更改排序比较器,仅 "flipping" 键和值也无济于事,如果可以重复 set 大小,则需要 multimap , 并且比上面构建索引更慢且更浪费内存(除非你可以在构建重新排序的 multimap 后丢弃原始 mymap )。

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

您不应该修改 std::map 中键的顺序(这没有任何意义,因为固定顺序 - 即键比较函数 - 是 [=13 的第二个模板参数=]).

所以得到 std::vector of keys from the 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;