2016-04-04 5 views
1

Ich habe einen vector von priority_queue s von string s:C++ Vektor priority_queue von Strings mit benutzerdefinierten Zeichenfolgen Komparator

vector<priority_queue<string>>> queues(VECTOR_CAPACITY); 

Und die Frage ist, wie kann ich auf diese priority_queue s benutzerdefinierte string Komparator gelten?

Wenn dies relevant sein sollte, wird der Komparator, den ich möchte, kürzere Strings vor längere setzen und wenn sie gleich lang sind, wird der Standardstringvergleich verwendet.

ich auf diese Weise versucht:

auto comparator = [] (string s1, string s2) { return s1.length() < s2.length() || s1 < s2; }; 
vector<priority_queue<string, vector<string>, decltype(comparator)>> queues(VECTOR_CAPACITY); 

aber mit dem folgenden Fehler nicht kompilieren:

No matching constructor for initialization of 'value_compare' (aka 
'(lambda at Example.cpp:202:23)') 

EDIT: Vergleicher, den kürzeren Strings vor längeren setzt und wenn sie sind gleiche Länge verwendet Standard lexikographischer Vergleich sieht so aus:

auto comparator = [] (string s1, string s2) 
{ 
    if (s1.length() != s2.length()) 
    { 
     return s1.length() > s2.length(); 
    } 
    return s1.compare(s2) > 0; 
}; 
+0

Eine vorgeschlagene Antwort für Ihre ** wie kann ich eine benutzerdefinierte ** 'Zeichenfolge ** ** Komparator anwenden? ** Frage: Eine Idee, die ich mir vorstellen kann, ist eine benutzerdefinierte Klasse, die eine' Zeichenfolge' hat es ist nur Mitglied. Damit könnten Sie die Komparatoroperatoren überladen, um zuerst die Länge der zwei Strings zu überprüfen, und wenn sie gleich sind, dann verwenden Sie den Vergleicher des 'string' selbst, um zu bestimmen, welcher größer als der andere ist. Dies ist nur ein Vorschlag, es könnte bessere Wege geben, dies zu tun. Ich glaube, das ist es, wonach Sie fragen, nicht wahr? – Fearnbuster

Antwort

4

Sie müssen auch die Instanz des Lambda zum std::priority_queue passieren, wie this Q&A sagt:

using my_queue_t = std::priority_queue< 
    std::string, std::vector<std::string>, decltype(comparator)>; 

std::vector<myqueue_t> queues(VECTOR_SIZE, my_queue_t(comparator)); 

Leider copy-list-Initialisierung dh {comparator} hier nicht funktioniert, weil die 2nd constructor overload ist aus irgendeinem Grund markiert explicit.


Ich änderte VECTOR_CAPACITY zu VECTOR_SIZE, weil das ist, was die Parameter bedeutet.

Verwandte Themen