2016-04-15 5 views
-2

Ich versuche eine Karte zu sortieren, die einen Schlüssel als String hat, und ein Paar, das lange nicht signiert hat, wenn ich die sort() Methode von #include verwende, versuche ich den < Operator zu überladen, aber wenn ich den übergeben habe Adresse des Beginns der Karte und am Ende habe ich nicht map.first zugreifen können, map.second.first oder map.second.secondSortieren einer Karte mit einem Schlüssel und einem Paar als Wert?

hat jemand irgendwelche Ideen

map<string, pair<unsigned long long, unsigned long long>> ext_count; 
    sort(map.rbegin(), map.rend()); // to sort descending 
bool operator < (map<string, pair<unsigned long long, unsigned long long>>& lhs, map<string, pair<unsigned long long, unsigned long long>>& rhs) { 
return lhs.first < rhs.first; 

}

+2

Ähm, eine Karte ist ein sortierter Container. Sie können keine Karte sortieren – NathanOliver

+1

Karte ist ein geordneter Container, der nicht "sortiert" werden kann - Sie können nur eine Sortierreihenfolge definieren, die immer für diese Karte verwendet wird. – SergeyA

+0

Also, wie würde ich die Sortierreihenfolge ändern? – Nikes

Antwort

0

Wie die Kommentare nahelegen, besteht eine Möglichkeit darin, die Karte in eine Karte mit einer anderen Sortierreihenfolge zu kopieren.

Hier ist ein kleines Beispiel, dies zu erreichen:

#include <map> 
#include <string> 
#include <algorithm> 
#include <iterator> 

// define the Sorter template class. If sortdir == true, then we sort ascending 
template <bool sortdir = true> 
struct Sorter 
{ 
    bool operator()(const std::string& left, const std::string& right) 
    { 
     if (sortdir) 
      return left < right; 
     return left > right; 
    } 
}; 

// our test maps 
typedef std::pair<unsigned long long, unsigned long long> mapDataType; 

// ascending map 
std::map<std::string, mapDataType, Sorter<>> myMap = 
          {{"abc", {0,0}}, {"def",{0,1}}}; 

// descending map 
std::map<std::string, mapDataType, Sorter<false>> myMap2; // descending map 

// sample program 
using namespace std; 
int main() 
{ 
    // copy ascending map to descending map 
    std::copy(myMap.begin(), myMap.end(), 
       std::inserter(myMap2, myMap2.begin())); 
} 

Beachten Sie, dass wir den dritten Parameter in der std::map Deklaration verwendet, um die Sortierer Prädikat angeben.

Zusätzlich wird die Funktion std::copy verwendet, um einfach alle Elemente von der Quellkarte in die Zielkarte zu kopieren.

Live Example

Verwandte Themen