Il modello di classe std::multiset
ha un primo parametro di modello specificando il tipo di oggetti da memorizzare nel set, e un secondo che specifica il tipo di un funtore confronto. Possiamo ignorare il terzo parametro del template per ora.
Il secondo parametro facoltativo, B
, deve implementare strict weak ordering e viene utilizzato per ordinare il set/multiset. Questo ordine è necessario per garantire la complessità logaritmica delle operazioni di ricerca degli elementi. Ecco un esempio:
struct A
{
int x;
};
struct B
{
bool operator()(const A& lhs, const A& rhs) const {
return lhs.x < rhs.x;
}
};
Questa classe B
ha un operator()
, che significa che può essere chiamato, per esempio
B comp;
A a1, a2;
bool a1lessThana2 = comp(a1, a2);
Ciò è necessario per il set/multinsieme posizionare gli elementi nella corretta posizione, e capire se due elementi sono uguali. Se è presente un valore operator<
per il tipo, è possibile omettere il secondo parametro del modello.
bool operator<(constA& lhs, const A& rhs) { return lhs.x < rhs.x; }
Questo è un esempio di utilizzo:
int main()
{
std::multiset<A, B> m;
A a1, a2;
a1.x = 23;
a2.x = 100;
m.insert(a1);
m.insert(a2);
}
'std :: multiset' è un modello standard da (in particolare 2011 standard) librerie di recente C++. Hai familiarità con i modelli C++ in generale? Comprendi 'std :: vector' e' std :: map' già ?? –
http://www.sgi.com/tech/stl/multiset.html – DumbCoder
@BasileStarynkevitch realtà 'std :: multiset' già esisteva in C++ 98, mentre il commento suona come esso è una caratteristica C++ 11 (o ho appena frainteso il tuo commento). –