![](/img/trans.png)
[英]Find a value of an element in vector in a std::map < int , std::vector <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'
}
另外,如果我翻转地图,正如一些帖子所建议的那样...
这不是一个好主意:只是“翻转”键和值不会不还更改排序比较器的帮助,你需要一个multimap
,如果set
的大小可以重复,而且速度较慢,比建立索引如上更浪费内存(除非在重新排序的multimap
构建后可以丢弃原始的mymap
)。
您只想以某种奇怪的排序顺序输出地图。
您不希望修改std::map
内部的键顺序(这没有任何意义,因为固定顺序(即键比较功能)是std::map
的第二个模板参数)。
因此,从std :: map获取键的std :: vector :
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.