Je suppose que c'est une question simple. J'ai besoin de faire quelque chose comme ça:
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 également besoin d'un itérateur? Je ne l'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 est d'utiliser un vecteur pour
s2
, puis de le trier plus tard. C'est peut-être mieux?
inserter(vec, vec.end())
fonctionne aussi pour les vecteurs, pourquoi est-ce que quelqu'un utilise back_inserter en premier lieu?insert
au lieu depush_back
sur un vecteur doit être à peu près identique (O (1)) quand aucun élément ne doit être déplacé.v.insert(x, v.end())
aura une branche supplémentaire au début (en raison du déplacement de n éléments, mais ici n vaut zéro). Cependant, utiliserinserter
1) communique une intention différente de l'utilisation depush_back
2) est inhabituel et incite le lecteur à s'arrêter et à penser que 3) est une pessimisation prématurée.En 2016, il a été proposé d'avoir un «
inserter
itérateur d' argument unique ». https://isocpp.org/files/papers/p0471r0.html . Je n'ai pas pu trouver si c'était la proposition avancée. Je pense que cela a du sens.Pour l'instant, vous pouvez avoir ce comportement définissant la fonction maker:
Utilisé comme:
la source
insert_iterator::operator=
). Devrait-il?insert
(etend
). il semble qu'ilforward_list
n'y ait pas d'insert
opération en premier lieu, seulementinsert_after
. Et même si cela est changé, il ne peut pas être inséré après la fin, je pense. Vous ne pouvez pas utiliser un à lastd::list
place?NewContaner new_container(old_other_container.begin(), old_other_container.end())
.existing_list = std::list(c.begin(), c.end(), existing_list.get_allocator())
très bien :-) Très bien, je pense que c'est ma réponse. À votre santé!