2012-11-22 9 views
6

Ho chiesto in un'altra domanda sul problema nel multiset, ma ora vedo che ho bisogno di una comprensione decente e non riesco a trovare nessun esempio più complicato in Internet.multiset in C++

puoi spiegarmi, forse esemplificare, come funziona multiset<A,B> e quale funzione è qui di A e di B, e anche se qualcuno di questi può essere omesso? Posso inserire A o B in una variabile? mi piacerebbe davvero apprezzare qualche breve esempio, o di riferimento,

+1

'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à ?? –

+0

http://www.sgi.com/tech/stl/multiset.html – DumbCoder

+0

@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). –

risposta

17

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); 
} 
+0

@juanchopanzaThank voi, il vostro grande aiuto insieme [questo] (http://en.cppreference.com/ w/cpp/container/multiset) lo cancelliamo molto bene! Quello di cui non sono ancora sicuro è: se metto 'multiset ', qual è la differenza di funzionalità, senza 'B'? vale la pena sapere come 'less <>' lavora con valori booleani per ordinare il contenuto di multimap? Voglio dire questa conoscenza potrebbe essere necessaria per alcune applicazioni in seguito. – berndh

+1

@eco_student 'B' è un mezzo per specificare la logica che si desidera utilizzare per l'ordinamento, o per specificare una logica se non c'è un operatore di valida' < '. Potresti avere criteri diversi per ordinare elementi di un dato tipo, quindi questo ti dà la libertà di decidere quale criterio usare su una base per-set/multiset. – juanchopanza