2011-05-11 24 views
45

Estoy escribiendo un pequeño fragmento de código donde tendré que insertar valores en un vector C++ STL en un lugar determinado según los valores en los elementos del vector . Estoy usando la función insert() para lograr esto. Me doy cuenta de que cuando quiero agregar un nuevo elemento al final del vector, simplemente podría usar push_back(). Pero para que mi código se vea bien, me gustaría utilizar exclusivamente insert(), que toma como entrada el iterador que apunta al elemento después del punto de inserción deseado y el valor que se va a insertar. Si el valor del iterador pasado como un argumento es v.end(), donde v es mi vector, ¿funcionará igual que push_back()?Usando C++ vector :: insert() para agregar al final del vector

¡Muchas gracias!

+3

Si se encuentra utilizando insertar mucho en un vector, puede estar utilizando una estructura de datos incorrecta. Considere (por ejemplo) usar un deque. Por supuesto, si el vector es pequeño, no habrá problema. –

+13

@Nick: Sí lo hará. Un simple experimento podría haberte dicho eso. –

+12

@Space No veo cómo un experimento podría haberle dicho eso. Si no fuera válido, obtendría UB, en cuyo caso su programa bien podría haber funcionado. –

Respuesta

77

a.push_back(x) es que tiene tiene semántica idéntica a (void)a.insert(a.end(),x) para los contenedores de secuencia que lo admitan.

Ver la tabla 68 en ISO/IEC 14882: 2003 23.1.1/12 [lib.sequence.reqmts].

+1

Pregunta rápida, en términos de rendimiento, me pregunto si pusk_back funciona más rápido? Probé algo que muestra que insertar es un poco lento. Solo quería asegurarme de ... Gracias – Saman

+1

push_back() no devuelve el iterador del elemento recién insertado. std :: list :: end() devolverá un iterador muerto. – peterh

14

Existe una leve diferencia en que push_back devuelve void si insert devuelve iterator al elemento que acaba de insertarse.

Por cierto, hay otra manera de verificar si lo hacen lo mismo: compilar los siguientes códigos

int main() 
{ 
    std::vector<int const> v; 
    v.push_back(0); 
    return 0; 
} 

el compilador mostrará una gran cantidad de mensajes molestos, acaba de leer y encontrará push_back llamadas insert (si no, intente compilar v.insert(v.end(), 0) para ver si llaman a la misma función de inserción) al final.