2009-05-25 39 views
65

Supongo que esta es una pregunta simple. Necesito hacer algo como esto:std :: back_inserter for a std :: set?

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

Por supuesto, std::back_inserter no funciona ya que no hay push_back. std::inserter también necesita un iterador? No he usado std::inserter, así que no estoy seguro de qué hacer.

¿Alguien tiene una idea?


Por supuesto, mi otra opción es usar un vector para s2, y luego simplemente ordenarlo más tarde. Tal vez eso es mejor?

Respuesta

98

set no tiene push_back porque la posición de un elemento está determinada por el comparador del conjunto. Utilice std::inserter y pasarlo .begin():

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

El iterador inserto a continuación, llamar s2.insert(s2.begin(), x) donde x es el valor pasado al iterador cuando se escriben en ella. El conjunto usa el iterador como una sugerencia de dónde insertar. Podrías usar bien s2.end().

+0

Funciona para std :: map también (me salvó el tiempo, gracias). – FreeNickname

+1

Dado que 'inserter (vec, vec.end())' también funciona para vectores, ¿por qué alguien usa back_inserter en primer lugar? – NHDaly

+5

@NHDaly: porque back_inserter es más rápido – marton78

Cuestiones relacionadas