如何按值排序boost :: unordered_map并按顺序返回唯一键? 我有地图像boost :: unordered_map和我需要我需要onc的列表按int值排序的枚举在asc/desc中。如何按值排序** boost :: unordered_map **并按顺序返回唯一键?
回答
一种unordered_map
是,顾名思义,固有地不排序或排序就地。您可以将值对插入set
,该值按该值排序,并从那里获取密钥(使用Boost.Range使这个事情更容易)。我使用std::set<T*>
来支付复制对象的费用。
#include <iostream>
#include <set>
#include <unordered_map>
#include <boost/range/adaptor/map.hpp>
#include <boost/range/adaptor/indirected.hpp>
#include <boost/range/adaptor/transformed.hpp>
struct compare_second{
template<class Pair>
bool operator()(Pair* lhs, Pair* rhs) const{
return lhs->second < rhs->second;
}
};
template<class T>
struct make_pointer{
typedef T* result_type;
T* operator()(T& v) const{ return &v; }
};
int main(){
using namespace boost::adaptors;
std::unordered_map<int, int> m{{0,4},{1,3},{2,2},{3,1},{4,0}};
typedef std::unordered_map<int,int>::value_type pair_type;
auto p = m | transformed(make_pointer<pair_type>());
std::set<pair_type*, compare_second> value_ordered(p.begin(), p.end());
for(auto x : value_ordered | indirected | map_keys)
std::cout << x << " ";
}
请注意,类似的事情可以用'std :: vector'和插入后排序来完成。 – Xeo
的最简单的方法是通过映射类型的值复制到载体中和对它们进行排序:
std::vector<value_type> values(std::begin(map), std::end(map));
boost::sort(boost::make_range(values),
[](const value_type &x, const value_type &y) { return x.second < y.second; });
std::vector<key_type> keys;
boost::push_back(keys, boost::make_range(values) | boost::map_keys));
我不知道boost库足够了,但我不确定提出的解决方案是否会生成按*映射值*排序的键的列表。解决这个问题的方法是相似的,但我担心它会花费更多的代码。再次,不熟悉库我可能不了解代码的作用。 –
@DavidRodríguez-dribeas哦,我没有看到那个要求。定影。 – ecatmur
您可以使用Boost Multi-Index Library。 boost :: multi_index_container可以具有有序状态和无序状态。
- 1. SAS proc sql按变量返回重复值/按顺序排序
- 2. 按顺序排列并按组排序
- 3. 如何按多个时间戳字段排序并按时间顺序返回?
- 4. 按保持键排序并保持价值顺序?
- 5. 返回按计数排序的唯一值的JavaScript函数
- 6. 按值和键排序哈希(按此顺序)
- 7. 按键/值按字母顺序排序列表
- 8. 按值(非关键字)按字母顺序排序NSMutableDictionary
- 9. 如何返回按键值排序的Riak对象?
- 10. 按一定顺序按多个键对数组排序
- 11. MongoDB $按顺序返回?
- 12. Sparql - 按顺序返回空值
- 13. 按字典顺序排列,并非唯一字符
- 14. 弹性搜索如何按字母顺序按组值排序?
- 15. Python如何按相反顺序按值排序字典
- 16. 按唯一值排序两列
- 17. 按唯一值排序哈希
- 18. Java按唯一索引号排序值
- 19. 一级键是按排序顺序存储,还是按SQL语句排序?
- 20. 排序的字典键按字母顺序,并创建排序键
- 21. Node.js/Mongoose /按顺序排序并显示
- 22. 按字母顺序排序,然后按字母顺序排列
- 23. Firebase按日期排序并按顺序排列计数
- 24. 按字母顺序排列并按单元格颜色排序
- 25. 如何按关键字按字母顺序排列字典
- 26. 如何按排序顺序插入
- 27. 如何按字母顺序排序NSMutableOrderedSet?
- 28. 排序值按特定的顺序
- 29. jQuery按顺序排序数组值
- 30. 返回按值排序的ReadOnlyDictionary
你需要对它进行排序吗?因为这或多或少是不可能的(理论上可能创建一个散列函数,这会导致一个排序的“无序:映射”)。否则,只需复制一个'map'(注意缺少'unordered_')(或者用适当的比较器将指针/迭代器放入'unordered_map'到'map'中),或者放入一个'vector'中并使用'sort'。 – Grizzly
如果你需要对地图进行排序,你应该使用'map'而不是'unordered_map'。 –