Sie haben Informationen zu binary_search()
zur Verfügung zu stellen, es zu sagen, wie Ihre Objekte zu vergleichen. Die beiden gebräuchlichsten Methoden sind entweder das Hinzufügen eines operator<()
zu dem struct
, wenn das möglich ist, oder das Bereitstellen einer Hilfsfunktion, die zwei struct
s miteinander vergleichen kann.
struct Main {
int mainID ;
string mainDIV ;
string mainNAME ;
bool operator<(const Main & other) const
{
return mainID < other.mainID ;
}
}
Dies vergleicht sich nur auf mainID
, aber man kann es von dort erweitern:
Die erste Form etwa so aussehen würde.
Außerdem lehrt dies nur den Compiler, wie man zwei struct Main
vergleicht, während @ Barry's obige Antwort einem int und einem struct Main
entspricht. Aber machen wir weiter mit dieser Antwort.
nun den Rekord für 5
zu finden, müssen wir es in eine machen struct Main
:
struct Main search_key = { 5 } ;
bool yes = std::binary_search(v.begin(), v.end(), search_key) ;
Nun, das ist nicht sehr elegant ist, und außerdem, wenn Sie einen Konstruktor für struct Main
(und haven‘ t es in Ihrem Beispiel), das wird nicht einmal funktionieren. Also fügen wir einen weiteren Konstruktor nur für int
hinzu.
struct Main
{
Main(int id, const string & a_div, const string & a_name) : id(id), div(a_div), name(a_name) { }
Main(int id) : id(id) { }
int id ;
string div, name ;
bool operator<(const Main &o) const { return id < o.id ; }
} ;
Jetzt können wir eine etwas kürzere Form tun:
bool has_3 = std::binary_search(v.begin(), v.end(), Main(3)) ;
Historische Anmerkung: Bjarne seit geraumer Zeit versucht hat, Standardvergleichsoperatoren in den Standard zu bekommen, aber nicht alle waren darüber begeistert bei den Normentreffen. Ich habe zwar beim letzten Treffen Fortschritte gemacht, und vielleicht wird es irgendwann erscheinen, wenn C++ 17 eine Sache ist.
2. Methode: http://en.cppreference.com/w/cpp/algorithm/binary_search –
Ich weiß nicht, ob ich dumm bin. Aber die Verbindung half überhaupt nicht. – user3706129