2017-01-09 95 views
3

我可以使用this答案按值降序对无序地图进行排序。为什么STL设置覆盖值对具有相同的值

然而,使用一组同样的工作失败:

void Test_SortMap() 
{ 
    unordered_map<string, int> CountTable; 
    CountTable["word"] = 1; 
    CountTable["spark"] = 15; 
    CountTable["the"] = 2; 
    CountTable["mail"] = 3; 
    CountTable["info"] = 3; 
    CountTable["sandwich"] = 15; 

    SortHashTableByValueDescending(CountTable); 
} 

yiels以下的输出:

#include <set> 
#include <functional>  
#include <iostream> 

using namespace std; 

typedef pair<string, int> Pair; 
typedef function<bool(Pair, Pair)> Comparator; 

Comparator DescendingSortComparator = [](Pair pair1, Pair pair2) { 
    return pair1.second > pair2.second; 
}; 

void SortHashTableByValueDescending(unordered_map<string, int> hashTable) { 
    set<Pair, Comparator> orderedSet(hashTable.begin(), hashTable.end(), DescendingSortComparator); 

    for (auto element : orderedSet) 
     cout << element.first << ": " << element.second << endl; 
} 

与下面的测试运行

spark: 15 
info: 3 
the: 2 
word: 1 

谁能请告诉我为什么设置(可能)覆盖具有相同值的对?无论如何,这些对的关键是不同的。

+0

因为它认为这些2个元素是一样的 – Danh

+0

为什么不使用'std :: sort'? – Danh

+2

比较器仅记录'unordered_map'的值,但不包含键。 – ks1322

回答

2

cppreference.com

的std ::集是一个包含有序集合 Key类型的独特对象的关联容器。

根据你比较单个的std ::对与固定第二元件可被存储在该组。

+0

感谢您的参考,我无法找到这些信息。有关如何使用set来工作的任何想法?我知道这是可能的,但我仍然想看看这种方法是否可以替代。 –

+0

当* second *元素的比较对相等时,您可以通过* first *元素进行排序。 –

+0

谢谢,将比较函数改为“返回pair1.second> pair2.second ||(pair1.second == pair2.second && pair1.first> pair2.first)”修复了它。不过,我不明白为什么这有助于您,请您详细说明一下。 –

3

查看Comparedefinition功能std::set

无处不在标准库使用比较概念,唯一性是通过使用等价关系来确定的。用不精确的术语,如果两个对象a和b都不比另一个小,则认为它们是等价的:!comp(a,b)& &!comp(b,a)。

这意味着相等数量会考虑equivalent,而不是复制到您的orderedSet

使用

Comparator DescendingSortComparator = [](Pair pair1, Pair pair2) { 
    if (pair1.second == pair2.second) 
     return pair1.first > pair2.first; 
    else return pair1.second > pair2.second; 
}; 

,如果你想保持他们

+0

你的回答是错误的,'pair1.second> = pair2.second'不是一个有效的比较器。 –

+0

数学?对于平等的情况它不是..但我认为这就是你想要重写比较函数的原因:实现自定义行为。 – pergy

+0

@pergy不幸的是,我之前尝试过,并且出于与Edgar Rokyan所回答的相同原因而导致运行时错误。 –

相关问题