使用C ++,我有一个带有int键和设置值的映射。我想根据集合的大小(即value.size())对输出的地图进行排序。我知道地图会根据密钥自动排序。有没有办法让地图按其值中的元素数排序?此外,如果我按照某些帖子的建议翻转地图,并且键设置了,地图如何确定排序顺序?任何帮助理解这一点将非常感激。
mymap<int, set<int> >;
/* code to fill map */
/* How to sort by mymap[node].second().size() ??? */
答案 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;