2010-02-24 3 views
18

Je souhaite insérer dans un vecteur C++ à une position connue. Je sais que la bibliothèque C++ a une fonction insert() qui prend une position et l'objet à insérer mais le type de position est un itérateur. Je souhaite insérer dans le vecteur comme je l'insérerais dans un tableau, en utilisant un index spécifique.C++ insérer dans un vecteur à une position connue

+0

En fait, ma méthode est un peu redondante. Luca a fait remarquer que vous pouvez facilement utiliser l'index sans avoir à vous soucier de récupérer l'itérateur. – nevets1219

+1

Vous ne pouvez pas - il n'y a pas de méthode 'insert' qui prend une position, les trois surcharges prennent des itérateurs, ce qui explique probablement pourquoi l'autre personne a supprimé sa réponse. –

+0

note que l'insertion au milieu d'un vecteur est assez lent, si vous le faites beaucoup, vous devriez envisager d'utiliser un autre conteneur –

Répondre

5

Regardez cette trace de débogage. La dernière chose qui est exécutée est std :: copy (__ first = 0x90c6fa8, __last = 0x90c63bc, __result = 0x90c6878). En repensant à ce qui l'a causé, vous avez appelé l'insertion donnant la position à insérer à 0x90c63bc. std :: copy copie la plage [first, last) au résultat, qui doit avoir de la place pour les éléments last-first. Cet appel a d'abord été <, ce qui est illégal (!), Donc je devine que la position que vous donnez à insérer est erronée. Etes-vous sûr que vnum n'a pas déboulé quelque part le long de la ligne? En GDB avec cette démonstration de trace, vous devez exécuter

cadre 10

impression VNUM

pour vérifier. En fait, si vous n'avez pas seulement abrégé dans votre question, je viens de trouver votre bug. Votre deuxième ligne est:

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

Il aurait dû être:

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

La première ligne donne le point d'insertion par rapport au début de certains autres sommets appelés variables, pas celui que vous voulez insérer dans.

9

Il est toujours agréable d'envelopper ces choses:

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

    return pContainer; 
} 

Cela devrait le faire. Il y a une réponse maintenant supprimée que vous pouvez construire un itérateur à partir d'un index, mais je ne l'ai jamais vu auparavant. Si c'est vrai, c'est définitivement la voie à suivre. Je le cherche maintenant.

+0

est-ce équivalent à faire quelque chose comme myVector.insert (myVector.begin() + index_num-1, objet)? – myx

+0

@myx: C'est exactement ça, sans le moins. – GManNickG

+1

Cela devrait être dans la bibliothèque standard. – Jon

21

Cela devrait faire ce que vous voulez.

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

Veuillez noter que les itérateurs peuvent être invalidés lorsque le vecteur est réalloué. S'il vous plaît voir ce site.

EDIT: Je ne sais pas pourquoi l'autre réponse a disparu ... mais une autre personne a dit quelque chose le long des lignes de:

myVec.insert(INDEX, DATA); 

Si je me souviens bien, cela devrait être très bien.

+0

Merci d'avoir rattrapé mon erreur ... mon habitude de mettre les choses à zéro semble avoir eu raison de moi. Également corrigé l'erreur dans le code. – nevets1219

+0

lorsque je fais cela 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]), j'obtiens un défaut seg après l'insertion. Ici, j = 0, vnum = 0, les sommets sont std: type de vecteur – myx

+0

@myx: Y a-t-il une raison pour laquelle vous n'utilisez pas 'std :: vector'? – GManNickG