2010-02-24 25 views
18

Deseo insertar en un vector C++ en una posición conocida. Sé que la biblioteca C++ tiene una función insert() que toma una posición y el objeto a insertar, pero el tipo de posición es un iterador. Deseo insertar en el vector como lo insertaría en una matriz, usando un índice específico.C++ insertar en el vector en la posición conocida

+0

En realidad, mi método es un poco redundante. Luca señaló que puedes usar el índice fácilmente sin tener que preocuparte por recuperar el iterador. – nevets1219

+1

No puede - no hay un método de 'inserción' que adopte una posición, las tres sobrecargas toman iteradores, que es probablemente la razón por la que la otra persona borró su respuesta. –

+0

tenga en cuenta que insertar en el medio de un vector es bastante lento, si lo hace mucho, debería considerar usar otro contenedor –

Respuesta

5

Mire ese rastro de depuración. Lo último que se ejecuta es std :: copy (__ first = 0x90c6fa8, __last = 0x90c63bc, __result = 0x90c6878). Mirando hacia atrás a lo que lo causó, llamó a insertar dando la posición para insertar como 0x90c63bc. std :: copy copia el rango [primero, último) al resultado, que debe tener espacio para el último - primer elemento. Esta llamada tiene el último < primero, que es ilegal (!), Así que supongo que la posición que está dando para insertar es incorrecta. ¿Estás seguro de que vnum no se ha desbordado en algún punto de la línea? En BGF con esa traza muestra, se debe ejecutar

bastidor 10

vNUM de impresión

comprobar. De hecho, si no acaba de abreviar en su pregunta, acabo de encontrar su error. Su segunda línea es:

new_mesh->Face(face_loc)->vertices.insert(vertices.begin()+vnum+1, new_vertices[j]); 

Debería haber sido:

new_mesh->Face(face_loc)->vertices.insert(new_mesg->Face(face_loc)->vertices.begin()+vnum+1, new_vertices[j]); 

La primera línea da el punto de inserción en relación con el inicio de algunas otros llamados vértices variables, no el que usted quiere insertar en.

9

Siempre es agradable para envolver estas cosas:

template <typename T> 
T& insert_at(T& pContainer, size_t pIndex, const T::value_type& pValue) 
{ 
    pContainer.insert(pContainer.begin() + pIndex, pValue); 

    return pContainer; 
} 

Eso debería hacerlo. Ahora hay una respuesta eliminada que dice que puedes construir un iterador a partir de un índice, pero nunca antes lo había visto. Si eso es cierto, ese es definitivamente el camino a seguir; Lo estoy buscando ahora.

+0

es equivalente a hacer algo como myVector.insert (myVector.begin() + index_num-1, object)? – myx

+0

@myx: es exactamente eso, sin el menos uno. – GManNickG

+1

Esto debería estar en la biblioteca estándar. – Jon

21

Esto debería hacer lo que quiera.

vector<int>myVec(3); 
myVec.insert(myVec.begin() + INTEGER_OFFSET, DATA); 

Tenga en cuenta que los iteradores pueden ser invalidados cuando se reasignan vectores. Por favor vea esto site.

EDITAR: No estoy seguro de por qué la otra respuesta desapareció ... pero otra persona mencionó algo a lo largo de las líneas de:

myVec.insert(INDEX, DATA); 

Si no recuerdo mal, esto debe estar muy bien.

+0

Gracias por descubrir mi error ... mi hábito de poner las cosas en nulo parece haberme ganado. También se corrigió el error en el código. – nevets1219

+0

cuando hago esto new_mesh-> Face (face_loc) -> vertices [vnum] = new_vertices [new_vertices.size() - 1]; new_mesh-> Face (face_loc) -> vertices.insert (vertices.begin() + vnum + 1, new_vertices [j]), aparece un error seg después de la inserción. Aquí, j = 0, vnum = 0, vértices es std: tipo de vector – myx

+0

@myx: ¿Hay alguna razón por la que no estés usando 'std :: vector'? – GManNickG

Cuestiones relacionadas