2009-05-25 4 views
65

Immagino che questa sia una domanda semplice. Ho bisogno di fare qualcosa di simile:std :: back_inserter per std :: set?

std::set<int> s1, s2; 
s1 = getAnExcitingSet(); 
std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ExcitingUnaryFunctor()); 

Naturalmente, std::back_inserter non funziona perché non c'è push_back. std::inserter ha bisogno anche di un iteratore? Non ho usato std::inserter quindi non sono sicuro di cosa fare.

Qualcuno ha un'idea?


Naturalmente, la mia altra opzione è quella di utilizzare un vettore per s2 e quindi ordinarlo in seguito. Forse è meglio?

risposta

98

set non ha push_back perché la posizione di un elemento è determinata dal comparatore del set. Utilizzare std::inserter e passarlo .begin():

std::set<int> s1, s2; 
s1 = getAnExcitingSet(); 
transform(s1.begin(), s1.end(), 
      std::inserter(s2, s2.begin()), ExcitingUnaryFunctor()); 

L'iteratore inserto sarà quindi chiamare s2.insert(s2.begin(), x) dove x è il valore passato al iteratore quando scritta ad esso. Il set utilizza l'iteratore come suggerimento da inserire. Potresti anche usare s2.end().

+0

Opere per std :: map pure (hai salvato il mio tempo, grazie). – FreeNickname

+1

Poiché 'inserter (vec.end())' funziona anche per i vettori, perché qualcuno usa back_inserter in primo luogo? – NHDaly

+5

@NHDaly: perché back_inserter è più veloce – marton78