2009-05-25 7 views
65

Je suppose que c'est une question simple. Je dois faire quelque chose comme ceci:std :: back_inserter pour un ensemble std ::?

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

Bien sûr, std::back_inserter ne fonctionne pas car il n'y a pas push_back. std::inserter a aussi besoin d'un itérateur? Je n'ai pas utilisé std::inserter donc je ne sais pas quoi faire.

Est-ce que quelqu'un a une idée?


Bien sûr, mon autre option consiste à utiliser un vecteur pour s2, puis de le trier plus tard. Peut-être que c'est mieux?

Répondre

98

set n'a pas push_back parce que la position d'un élément est déterminée par le comparateur de l'ensemble. Utilisez std::inserter et passer .begin():

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

L'insert iterator appellera alors s2.insert(s2.begin(), x)x est la valeur à l'itérateur lorsqu'il est écrit à elle. L'ensemble utilise l'itérateur comme indice d'insertion. Vous pouvez aussi bien utiliser s2.end().

+0

Fonctionne aussi pour std :: map (vous avez économisé mon temps, merci). – FreeNickname

+1

Puisque 'inserter (vec, vec.end())' fonctionne aussi pour les vecteurs, pourquoi quelqu'un utilise-t-il back_inserter en premier lieu? – NHDaly

+5

@NHDaly: parce que back_inserter est plus rapide – marton78