2010-10-21 28 views
2

Je voudrais sérialiser le vecteur. Et je sais pas comment changer le pointeur de vecteur .. Pour faire simple, disons que j'ai quelque chose de vecteur comme:C++ vector Comment changer le pointeur interne

vector<char> v; 

Et je ce pointeur:

char* c = { 'v', 'e', 'c', 't', 'o', 'r' }; 

et je voudrais pointeur interne de mon vecteur v points char * c:

&v[0] -> c 

Comment puis-je régler vecteur qu'il tient à c? Y a-t-il un moyen de le faire?


EDIT 22.10.2010

Alors les gars, après vecteur de débogage je suis venu avec cette solution:

vector<char> dump; 
memcpy(&myVector, &dump, sizeof(myVector)); // I change contents so it can work 
myVector.assign(buf, buf+5); // copy contents into it from buffer (I don't like this part) 

Et pour travailler ce que je devais définir

_ITERATOR_DEBUG_LEVEL=0 

parce que c'est initialement mis à 2 et il fait effectivement une vérification de débogage (je suppose) Ce n'est pas défini en mode de libération aussi bien? Donc c'est ma solution de contournement pour l'instant, je voudrais forcer ppl à supprimer le vecteur à long terme ... Alors les gars, que penses-tu de cette solution? Et les dangers que vous voyez?


J'ai réellement besoin de sérialiser le vecteur par memcpy. Je veux sérialiser toute ma classe (comme prendre un instantané de la mémoire) et l'écrire dans un fichier, et lors du rechargement, le lire à partir du fichier et restaurer l'objet sans appeler son constructeur et en utilisant un nouvel opérateur.

Umm ce conteneur vecteur se déroule sur la mémoire de la pile, donc memcpy ne peut pas l'atteindre car il est seul souci est tas ... Eh bien ce morceau de code pourrait fonctionner pour moi maintenant:

copie (buf, buf + 5 myVvector.begin());

Eh bien cela ne fonctionne pas aussi, puisque je n'utilise pas de nouveau mot-clé sur ma classe, ce vecteur, autant que je le comprends, n'est pas initialisé. Donc, si j'essaie de copier, push_back_fill ce vecteur avec smt, il me donne cette erreur:

Exception non gérée à 0x00ec455b dans newDel.exe: 0xC0000005: violation de l'accès lecture emplacement 0x00654b4c.

ce qui a du sens ... Donc, n'importe qui sait comment puis-je appeler constructeur/initializor de vecteur de l'extérieur?

+0

Votre édition fait de très mauvaises choses je pense. Qu'est-ce que myVector? - mais que ce soit un tampon char ou un autre vecteur, vous contournez un comportement indéfini. Vous pourriez vous en tirer cependant si 'vecteur v (len); memcpy (& v [0], charbuffer, len); ' –

+0

vecteur myvector ... eh bien ce n'est pas grave parce que c'était juste un exemple, pas le code réel. des dangers connus? – MCA

+0

"Je n'aime pas cette partie" ... Personnellement, ce n'est pas cette partie que je n'aime pas le plus. –

Répondre

4

Si vous aviez

vector<char> foo; 

foo.push_back('v'); 
foo.push_back('e'); 
foo.push_back('c'); 
foo.push_back('t'); 
foo.push_back('o'); 
foo.push_back('r'); 

char *c = &foo[0]; 

Cela fait un point de pointeur vers le premier élément du contenu du vecteur. Cela restera valide jusqu'à ce que vous essayiez de redimensionner le vecteur.

EDIT:

Vous pouvez faire ce que vous voulez de cette façon:

copy(c, c+6, back_inserter(myVector)); 

qui est l'appel de copyalgorithm et l'appel de fonction back_inserter de iterator.

+0

J'ai besoin de l'implémantation inverse de cela .. J'ai un tampon char *, et je dois l'assigner à un pointeur internap vectoriel ... – MCA

+1

@MCA voir ma réponse éditée.Vous ne pouvez pas avoir le pointeur interne du vecteur réaffecté à votre propre pointeur. Vous pouvez avoir le vecteur contenant ce que votre tableau a quand il est assigné comme ci-dessus. Cependant, si vous changez le tableau, le vecteur ne changera pas. – wheaties

+0

J'ai essayé l'algorithme de copie, puisque je n'ai jamais appelé le constructeur, le vecteur manque son travail interne. J'ai posté une autre réponse ci-dessous ... Si je peux générer mon vecteur, je peux copier le contenu ... – MCA

0

Si c'est "interne" alors probalby de ne pas être falsifié!

+0

bien .. euh ... peu importe ... – MCA

3

Il n'y a pas de façon standard de le faire. Vous pourriez creuser dans une implémentation donnée et voir comment faire face à cela (bien qu'il n'y ait peut-être pas de solution), mais votre astuce pourrait échouer si votre bibliothèque était modifiée ou mise à jour. Les auteurs de bibliothèques ne ressentent généralement pas le besoin de soutenir de telles utilisations.

vector<> est une classe de conteneur. Ce n'est pas un wrapper pour un tableau de type C, bien qu'il en conserve un interne. Son comportement et ses performances sont spécifiés par la norme, mais pas ses internes (sauf que son contenu doit être stocké dans la mémoire contiguë). Les auteurs de bibliothèques profitent de cette liberté pour réaliser les meilleures implémentations possibles. Supposons que vous puissiez assigner au pointeur interne.

Cela pointe sans doute vers la mémoire du magasin libre, mais il ne peut pas pointer vers le début de la mémoire, la valeur de retour de new ou malloc(). La taille de la mémoire doit être au moins suffisante pour contenir la capacité multipliée par la taille des éléments, mais elle peut en fait être plus grande. Le vector<> peut compter sur le fait que son contenu fait partie d'un pool spécifique, ou être alloué et désalloué d'une manière spécifique. L'allocation peut affecter d'autres membres de données de vector<>, tels que peut-être un pointeur vers .end(). Dans tous ces cas, vous ne pouvez pas gérer vous-même la mémoire et les variables sans connaître l'implémentation exacte.

En général, l'interférence avec les composants internes de la mise en œuvre est sujette aux erreurs et peut potentiellement se rompre, avec ou sans effets immédiatement évidents, en cas de modification de la bibliothèque. Ce n'est pas souvent nécessaire, ni même souhaitable. Trouvez un autre moyen de sérialiser les vecteurs.

+0

oui je vous ai. Mais j'ai encore besoin de jouer avec ça. Sinon je force ppl à supprimer le vecteur sur demande! SO ce serait génial si je trouve un moyen de le faire ... – MCA

0

Cela vous serait-il utile?

vector<char*> v; 
char* c = { 'v', 'e', 'c', 't', 'o', 'r' }; 
v.push_back(c); 
+0

Je souhaite qu'il serait .. Mais l'allocation interne est foiré! donc repousser ça ne marche pas ... – MCA

0

Si vous utilisez un autre vecteur pour votre tampon d'E/S, vous pouvez ensuite utiliser std::swap pour modifier le contenu (il mettra à jour le pointeur et tout autres données est appropriée, comme lorsque le compte est stocké).

0

J'ai vu votre propre réponse (laquelle btw ne devrait pas être affichée comme réponse, elle aurait dû être éditée dans la question). Donc vous voulez faire une sérialisation en C++. Abandonnez-vous sur memcpy et utilisez les fonctions de sérialisation appropriées telles que boost :: serialization. Ce n'est pas bien mais c'est nécessaire. Sinon, cela ne fonctionnera tout simplement pas - C++ ne fonctionne pas de cette façon.

+0

ok c'est mon premier article ici, donc je n'étais pas sûr de répondre à ma propre question ou de l'éditer .. :) Je travaille sur un gros projet, nous avons beaucoup de code ici, donc je ne peux simplement pas ajouter des bibliothèques, ou supprimer le vecteur de partout. D'abord j'ai besoin de trouver un moyen de travailler, si ça ne marche pas, j'ai besoin d'un contact avec les autres pour discuter de l'utilisation d'un autre vecteur lib/remove/ou faire mon travail de manière différente ... Et j'ai trouvé un solution .. éditons mon post précédent :) – MCA