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_sort
n(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());
那应该很好用。