2010-12-23 4 views
8

Derzeit versuche ich Kombinationen zu erzeugen und ich den folgenden Code verwende:Welche Bibliotheken brauche ich, um std :: Platzhalter zu verwenden?

#include <vector> 
#include <algorithm> 
#include <iostream> 
#include <functional> 

template<class RandIt, class Compare> 
bool next_combination(RandIt first, RandIt mid, RandIt last) 
{ 
    std::sort(mid, last, std::bind(std::less<int>(), std::placeholders::_2 
              , std::placeholders::_1)); 
    return std::next_permutation(first, last, std::less<int>()); 
} 

Mit g ++ nicht sagen, es zu kompilieren:

next_combo.cpp: In function ‘bool next_combination(RandIt, RandIt, RandIt)’: 
next_combo.cpp:10: error: ‘bind’ is not a member of ‘std’ 
next_combo.cpp:10: error: ‘std::placeholders’ has not been declared 
next_combo.cpp:11: error: ‘std::placeholders’ has not been declared 

Ich dachte, dass std :: Platzhalter in funktioneller deklariert wurden Aber jetzt bin ich verwirrt. Sollte ich nur Boost verwenden?

Auch der Rest des Projekts verwendet C++ 0x, gibt es also eine bessere Möglichkeit, dies mit C++ 0x Features zu schreiben?

Jede Hilfe sehr geschätzt :)

+3

müssen Sie C++ 0x Flag mit Ihrem g ++ - Compiler verwenden, um diese zu bekommen. Oder boost :: bind. – Anycorn

+0

@aaa, danke, das sieht aus wie es mein Problem gelöst hat. – shuttle87

+1

Warum verwenden Sie nicht lambdas anstelle der lästigen Bindung? Wenn Sie C++ 0x verwenden, ist es sinnvoll, std :: sort (v.begin(), v.end(), [] (int l, int r) zu schreiben -> bool { zurückgeben l> r; }); intead –

Antwort

5

Warum verwenden Sie nicht lambdas anstelle von lästigen binden? wenn Sie C++ 0x verwenden, hat es Sinn

std::sort(v.begin(), v.end(), [](int l, int r)->bool { return l > r; });

statt zu schreiben. Beachten Sie, dass Sie dort den Rückgabetyp nicht explizit angeben müssen. Ich habe diesen Weg nur geschrieben, um es klarer zu machen.

7

Off Natürlich gibt es einen besseren Weg gibt. Verwenden Sie std :: greater_equal, anstatt das oben genannte zu tun. Überprüfen Sie here, was es sonst noch im Funktionsbereich gibt.

Vergessen zu sagen - Um Platzhalter zu verwenden, müssen Sie C++ 0x Funktionen aktivieren.

+1

Oder eher 'std :: greater' in absteigender Reihenfolge oder mit umgekehrten Iteratoren sortiert. – UncleBens