std::map将对其元素进行排序keys。它不关心values何时排序。
您可以使用std::vector<std::pair<K,V>>然后使用std::sort后跟对其进行排序std::stable_sort:
std::vector<std::pair<K,V>> items;
//fill items
//sort by value using std::sort
std::sort(items.begin(), items.end(), value_comparer);
//sort by key using std::stable_sort
std::stable_sort(items.begin(), items.end(), key_comparer);
第一种应该使用,std::sort因为它是,nlog(n)然后在最坏的情况下使用。std::stable_sortn(log(n))^2
请注意,std::sort选择虽然是出于性能原因,但std::stable_sort需要正确排序,因为您希望保留按值排序。
@gsf 在评论中指出,只有 std::sort当您选择一个首先比较的比较器时才能使用values,如果它们相等,则对keys.
auto cmp = [](std::pair<K,V> const & a, std::pair<K,V> const & b)
{
return a.second != b.second? a.second < b.second : a.first < b.first;
};
std::sort(items.begin(), items.end(), cmp);
那应该是有效的。
但是等等,有一个更好的方法:存储std::pair<V,K>而不是std::pair<K,V>然后你根本不需要任何比较器 - 标准比较器std::pair就足够了,因为它首先比较first(这是V)然后second是K:
std::vector<std::pair<V,K>> items;
//...
std::sort(items.begin(), items.end());
那应该很好用。