Supongo que esta es una pregunta simple. Necesito hacer algo como esto:
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 lo he usado, std::inserter
así que no estoy seguro de qué hacer.
¿Alguien tiene alguna idea?
Por supuesto, mi otra opción es usar un vector para
s2
y luego ordenarlo más tarde. ¿Quizás eso sea mejor?
inserter(vec, vec.end())
funciona para vectores, ¿por qué alguien usa back_inserter en primer lugar?insert
lugar depush_back
en un vector debe ser aproximadamente idéntico (O (1)) cuando no es necesario mover ningún elemento.v.insert(x, v.end())
tendrá una rama adicional al principio (debido a que mueve n elementos, pero aquí n es cero). Sin embargo, usarinserter
1) comunica una intención diferente a usarpush_back
2) es inusual y hace que el lector se detenga y piense 3) es una pesimización prematura.En 2016 hubo una propuesta para tener un "
inserter
iterador de argumento único ". https://isocpp.org/files/papers/p0471r0.html . No pude encontrar si la propuesta avanzaba. Creo que tiene sentido.Por ahora puede tener este comportamiento definiendo la función de creador:
Usado como:
fuente
insert_iterator::operator=
). ¿Deberia?insert
(yend
). parece queforward_list
no tiene unainsert
operación en primer lugar, soloinsert_after
. E incluso si eso se cambia, no se puede insertar después del final, creo. ¿No puedes usar unstd::list
en su lugar?NewContaner new_container(old_other_container.begin(), old_other_container.end())
.existing_list = std::list(c.begin(), c.end(), existing_list.get_allocator())
Muy bien, creo que esa es mi respuesta. ¡Salud!