2013-03-29 18 views
5

Ich versuche, dieses Websocket ++ Beispiel zu zerlegen https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cppWas ist der Zweck von std :: set <VALUE, std :: owner_less <VALUE>>?

Bei Zeile 126 gibt es typedef std::set<connection_hdl,std::owner_less<connection_hdl>> con_list;. Ich frage mich, warum es nicht nur typedef std::set<connection_hdl> con_list; ist.

Ich habe gelesen How does the Comma Operator work und http://en.cppreference.com/w/cpp/memory/owner_less, aber ich bin mir nicht sicher, was der Zweck ist.

Was ist eigentlich in der std::set gespeichert? Was macht std::owner_less eigentlich? Was ist der Zweck, einen Behälter mit dieser Struktur zu machen, anstatt die connection_hdl s selbst zu speichern?

+2

Dies hat nichts mit dem Komma-Operator zu tun, und die Seite, auf die Sie für 'std :: owner_less' verlinkt haben, sollte Ihre Frage direkt beantworten. – ildjarn

+1

'std :: set' nimmt mehrere Vorlagenparameter, aber nur der erste ist explizit erforderlich; Der Rest hat Standardtypen, wenn Sie sie nicht definieren. Der zweite Parameter ist eine Binärfunktion, die zum Sortieren verwendet wird. –

+2

BTW, 'connection_hdl' ist ein' std :: weak_ptr '. –

Antwort

8

Das hat nichts mit dem Komma-Operator zu tun. A set<T> erfordert, dass T weniger als vergleichbar ist, d. H. operator < sollte für T definiert werden. Der Grund dafür ist, dass das Set seine Elemente in einer geordneten Weise (über eine Art von Baum oder eine andere) hält. Sie können eine Menge mit einem zweiten Template-Argument angeben - einem Funktor, der zwei Elemente vergleicht, sodass das Set diesen Vergleich verwenden kann. std::owner_less ist eine Prädikatvorlage, die auf gemeinsamen und schwachen Zeigern arbeitet und eine eigentümerbasierte (im Gegensatz zur wertebasierte) Reihenfolge ausführt.