2016-11-07 1 views
0

sagen, dass ich meine Tupel wie folgt definieren:benutzerdefinierte Sortierung geordnete Karte mit Tupel als Schlüssel

typedef tuple<string, string> bigram; 

Und meine Karte Karten Tupeln auf ganze Zahlen:

map<bigram, int> mymap; 

Wie kann ich eigene meine Komparator so dass mymap ist nach der alphabetischen Reihenfolge der ersten Zeichenfolge in einem bigram sortiert?

Ich denke, irgendwo entlang der Linien von

map<bigram, int, greater<bigrams[0]>> mymap; 

Antwort

2

Erste - alphabetischer Reihenfolge bedeutet, dass Sie wollen less statt greater. Zweitens sollte die Standardsortierreihenfolge für tuple<string, string> nur für Sie arbeiten. Hinweis: Die verschiedenen Vorschläge, die Leute geben, tun wahrscheinlich nicht, was Sie wollen. Sie würden alle {"foo", "bar"} und {"foo", "baz"} als gleich vergleichen, wenn Sie wahrscheinlich möchten, dass sie als verschiedene Objekte behandelt werden. Wenn Sie rückwärts sortieren wollen, sollten Sie in der Lage sein, map<bigram, int, std::greater<bigram>> zu tun, ansonsten bleiben Sie einfach auf map<bigram, int>.

die Definition der Vergleichsoperator als Referenz, die mit Tupel kostenlos kommen: http://en.cppreference.com/w/cpp/utility/tuple/operator_cmp

1

einen Komparator definieren entweder als eine Funktion oder ein Funktionsobjekt und übergeben Sie das:

bool comparator(const bigram& a, const bigram& b) 
{ 
    ... 
} 
std::map<bigram, int, comparator> map; 

Der Komparator, wenn die Argumente wahr zurückgeben sollte sind schon bestellt (a ist vor b).

1

Es kann wie folgt realisiert werden:

typedef std::tuple<std::string, std::string> bigrams; 

struct bigrams_comp { 
    bool operator()(const bigrams& lhs, const bigrams& rhs) { 
     // return std::greater<std::string>()(std::get<0>(lhs), std::get<0>(rhs)); 
     return std::get<0>(lhs) > std::get<0>(rhs); 
    } 
}; 

int main() 
{ 
    std::map<bigrams, int, bigrams_comp> mymap; 
} 
+0

Irgendwelche Gründe für 'std :: greater'? Warum nicht? Std :: get <0> (lhs)> std :: get <0> (rhs) '? – Rakete1111

+0

@ Rakete1111, weil er größer in seiner Frage verwendet – Danh

0

Sie Bigramme verwendet, aber Bigramm definiert, hat es ein Tippfehler?

Der Vergleichsfunktionstyp muss zwei Typen vergleichen Gibt einen Bool-Wert zurück.

struct MyCompare 
{ 
    bool operator()(const bigram &a, const bigram &b) 
    { 
     return std::get<0>(a) > std::get<0>(b); 
    } 
}; 

map<bigram, int, MyCompare> mymap; 
1

Wenn Sie einen richtigen Vergleich wollen, müssen Sie jede Komponente des Tupels überprüfen.

Für mich ist die gute Antwort ist:

typedef std::tuple<std::string, std::string> bigrams; 

    struct bigrams_comp { 
     bool operator()(const bigrams& lhs, const bigrams& rhs) { 
      if (std::get<0>(lhs) == std::get<0>(rhs)) { 
       return std::get<1>(lhs) > std::get<1>(rhs); 
      } else { 
      return std::get<0>(lhs) > std::get<0>(rhs); 
      } 
     } 
    }; 

Ansonsten ist die binäre Suche der Karte falsch sein wird.

Sag mir, wenn ich falsch liege.

Verwandte Themen