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;
使用 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;