2013-03-29 12 views
5

sto cercando di sviscerare questo websocket ++ esempio https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cppqual è lo scopo di std :: set <VALUE, std :: owner_less <VALUE>>?

In linea 126, c'è typedef std::set<connection_hdl,std::owner_less<connection_hdl>> con_list;. Mi chiedo perché non si tratta semplicemente di typedef std::set<connection_hdl> con_list;.

Ho letto How does the Comma Operator work e http://en.cppreference.com/w/cpp/memory/owner_less ma non sono sicuro di quale sia lo scopo.

Cosa viene effettivamente memorizzato nello std::set? Cosa fa in realtà std::owner_less? Qual è lo scopo di creare un contenitore con questa struttura invece di memorizzare gli stessi connection_hdl s?

+2

Questo non ha nulla a che fare con l'operatore virgola, e la pagina a cui ti sei collegato per 'std :: owner_less' dovrebbe rispondere direttamente alla tua domanda. – ildjarn

+1

'std :: set' richiede più parametri del modello, ma solo il primo è esplicitamente richiesto; il resto ha dei tipi predefiniti se non li definisci. Il secondo parametro è una funzione binaria utilizzata per l'ordinamento. –

+2

BTW, 'connection_hdl' è un' std :: weak_ptr '. –

risposta

8

Questo non ha nulla a che fare con l'operatore virgola. A set<T> è necessario che T sia inferiore al confronto, ovvero operator < deve essere definito per T. La ragione di ciò è che il set mantiene i suoi elementi in modo ordinato (tramite un tipo di albero o un altro). È possibile fornire un set con un secondo argomento template - un functor che confronta due elementi in modo che il set possa utilizzare tale confronto. std::owner_less è un modello di predicato che opera su puntatori condivisi e deboli ed esegue ordinamenti basati sul proprietario (anziché sul valore).