2015-07-09 4 views
2

Я пытаюсь сортировать unordered_map с помощью функции sort(), но я продолжаю получать ошибку компилятора. Может ли кто-нибудь помочь?sort an unordered_map using sort()

bool comp(pair<char,int> a, pair<char,int> b) { 
    return a.second < b.second; 
} 

void rearrangeKDist(char str[], int d) { 
    int n = strlen(str); 
    unordered_map<char, int> table; 
    for (int i=0; i<n; i++) { 
     unordered_map<char, int>::iterator it = table.find(str[i]); 
     if (it == table.end()) { 
      table.insert(make_pair(str[i], 1)); 
     } else { 
      it->second = it->second+1; 
     } 
    } 
    for (unordered_map<char, int>::iterator it=table.begin(); it!=table.end(); it++) 
     cout<<it->first<<" "<<it->second<<endl; 
    sort(table.begin(), table.end(), comp); 
    for (unordered_map<char, int>::iterator it=table.begin(); it!=table.end(); it++) 
     cout<<it->first<<" "<<it->second<<endl; 

} 
+7

Почему вы хотите отсортировать * неупорядоченный * карта? Если вам нужны данные для сортировки, используйте обычную карту. (PS: вы не сможете сортировать его на месте, это сломает инварианты карты) – Borgleader

+0

Боковой узел, вместо 'find' /' insert'/increment ... вы могли бы просто сделать '++ table [str [i]]; ' – Barry

+0

Возможный [дубликат] (http://stackoverflow.com/questions/24212356/why-stl-unordered-map-and-unordered-set-cannot-be-sorted-by-stl -алгоритмы)/мое объяснение [здесь] (http://stackoverflow.com/questions/24212356/why-stl-unordered-map-and-unordered-set-cannot-be-sorted-by-stl-algorithms/30971939# 30971939) –

ответ

8

Это невозможно как с компиляцией, так и с логической точки зрения. С точки зрения типа, std::sort требует:

-RandomIt должен отвечать требованиям ValueSwappable и RandomAccessIterator.
-Тип разыменованного RandomIt должен соответствовать требованиям MoveAssignable и MoveConstructible.

Тип итератора на std::unordered_map является ForwardIterator, не RandomAccessIterator, поэтому первое требование не удовлетворено. Тип разыменованного итератора - pair<const Key, T>, который не является MoveAssignable (не может назначаться const), поэтому второе требование также неудовлетворено.

С логической точки зрения, сортировка неупорядочен контейнер не имеет смысла. Это неупорядочено. И сложность гарантирует, что unordered_map может достичь требуемого очень специфического заказа, которого вы не должны быть, и не разрешаете общаться.

Если вы хотите «сортировать» ваш unordered_map, поместите их в vector:

std::vector<std::pair<char, int>> elems(table.begin(), table.end()); 
std::sort(elems.begin(), elems.end(), comp); 
+1

Для 'std :: sort' нам нужно:' #include ' –