2013-03-09 4 views
7

, wie ichWie kann ich Lambda für Container Vergleichsoperator verwenden? Dies ist

priority_queue< int, vector<int>, greater<int> > third (myints,myints+4); 

    // using mycomparison: 
    priority_queue< int, vector<int>, mycomparison > q1; 
class mycomparison 
{ 
public: 
    bool operator() (const int& lhs, const int&rhs) const 
    { 
    return (lhs<rhs); 
    } 
}; 
    typedef priority_queue<int,vector<int>,mycomparison> q2; 

Aber ich frage mich, ob ich dort Lambda-Funktionen integrierte Funktion oder eine neue Klasse als benutzerdefinierten Komparator ..

kann
+1

Lambdas sind Funktoren, während Container einen Funktor * Typ * benötigen. Sie könnten zwar etwas mit 'declltype' machen (aber ich würde nicht erwarten, dass es in MSVC2010 funktioniert). – Cameron

+2

Ja, Sie könnten ein Lambda verwenden, aber das Lambda müsste so global sein wie die globalste Deklaration seiner Verwendung als ein Typ, der den Zweck verfehlt und im Allgemeinen unordentlicher ist. – GManNickG

Antwort

19

Zunächst definiert das Lambda verwenden würde:

auto compareFunc = [](int a, int b) { return a > b; }; 
verwenden

Dann decltype:

typedef priority_queue<int, vector<int>, decltype(compareFunc)> q2; 

wenn Sie jetzt verwenden q2, passieren in der Funktion:

q2 myQueue(compareFunc); 

Grundsätzlich priority_queue nimmt die Art der Funktion, wie es 3. Template-Argument ist, während der Konstruktor für diese Funktion nimmt einen Zeiger selbst.

+5

Beachten Sie, dass dies die Erstellung einer globalen Variablen erfordert, die die gleiche Sichtbarkeit wie 'q2' haben muss. Wenn Sie also 'q2' in einer Kopfzeile benötigen, müssen Sie diese globale Variable auch in einer Kopfzeile haben. Was ist nicht die einfachste Sache in der Welt, wenn Sie 'Auto' verwenden wollen. –

+0

@ NicolBolas, was würden Sie vorschlagen? – Yola

+2

@Yola: Ich würde vorschlagen, eine Struktur für die Vergleichsfunktion anstelle eines Lambda zu verwenden. Es gibt keinen Vorteil, ein Lambda hier zu verwenden. –

Verwandte Themen