2010-07-15 7 views
0

J'essaie d'utiliser un grand vecteur 2D que je veux allouer avec new (car il est grand).affecter des éléments dans un vecteur déclaré avec new. C++

si je dis:

vector< vector<int> > bob; 
bob = vector< vector<int> >(16, vector<int>(1<<12,0)); 
bob[5][5] = 777; 

cela fonctionne. Mais si je dis:

std::vector< std::vector<int> > *mary; 
mary = new vector< vector<int> >(16, vector<int>(1<<12, 0)); 
mary[5][5] = 777; 

cela ne fonctionne pas et je reçois l'erreur:

Erreur 1 erreur C2679: binaire « = »: aucun opérateur trouvé qui prend un opérande à droite de type ' int '(ou il n'y a pas de conversion acceptable) c: \ Utilisateurs \ jsparger \ Documents \ Mon Dropbox \ ARI \ VME_0.01 \ VME_0.01 \ V965.cpp 11 VME_0.01

Évidemment, je suis nouveau en C++. Quelqu'un pourrait-il expliquer quelle syntaxe j'ai besoin d'utiliser pour effectuer cette opération. mary est un pointeur, donc je peux voir pourquoi cela ne marcherait pas, mais * mary [5] [5] = ce qui n'est pas autorisé non plus à cause de "nouveau", n'est-ce pas?

Merci pour l'aide. Ce vecteur est ce que je vais utiliser pour le moment car il semble assez facile à comprendre pour mon petit cerveau C++, mais n'hésitez pas à me le faire savoir si un grand vecteur comme celui-ci est une mauvaise idée, etc

Merci beaucoup .

Editer: Je me trompe sur le "non autorisé en raison de la nouvelle". Je ne sais pas où j'ai mal lu cela, parce que cela fonctionne évidemment, et cela n'aurait pas beaucoup de sens de ne pas le faire. Merci.

+0

Que voulez-vous dire "* mary [5] [5] = ce qui n'est pas autorisé non plus à cause de" nouveau ""? Précisez s'il vous plaît.Vous vous trompez probablement ici. – atzz

Répondre

5

Si mary est un pointeur alors vous devez déréférencer avant d'appliquer l'opérateur d'indexation:

(*mary)[5][5] = 777; 

Les parenthèses sont nécessaires parce que l'indice a une priorité plus élevée que le déréférencement.

+1

Bien sûr, [comme le souligne FredOverflow] (http://stackoverflow.com/questions/3256910/assign-elements-in-vector-declared-with-new-c/3256933#3256933), il n'y a pas beaucoup de fois qu'il est utile d'allouer dynamiquement un 'vecteur'. –

+0

d'accord, merci. Pour une raison quelconque, j'avais l'impression que vous ne pouviez pas faire cela si vous alliez avec du neuf. (plus je le faisais mal quand je l'ai essayé de toute façon). Je suppose que j'ai mal lu quelque chose quelque part. Merci pour l'aide sur une question aussi stupide. – Johnny

6

De toute façon, les vecteurs stockent leurs éléments sur le tas. Il ne sert à rien d'allouer l'objet vectoriel lui-même sur le tas, car il est très petit (typiquement 12 octets sur une machine 32 bits).

+0

Une raison valable pour cela est d'éviter de devoir copier l'objet vecteur de base lors de son passage entre les appels de fonction. –

+0

@jMerliN, 'std :: swap' –

+1

@jMerliN: passe par référence (-to-const) résout déjà ce problème ... – fredoverflow

2

En langage C, les tableaux et les pointeurs sont similaires (pas les mêmes!), Ce qui conduit à votre confusion. En C ordinaire, si vous avez les déclarations suivantes:

int array1[100]; 
int *array2 = (int *)malloc(100*sizeof(int)); 

vous pouvez utiliser array1 et array2 exactement de la même manière.

Cependant, si vous écrivez ceci dans C:

int (*array3)[100]; 

C'est quelque chose de complètement différent. Array3 est maintenant un pointeur sur un tableau, pas un pointeur sur les éléments du tableau plus, et si vous voulez accéder à un élément, vous devez écrire ceci:

(*array3)[5] = 123; 

En C++, vous faites vraiment quelque chose De la même façon, le second 'mary' est un pointeur sur le vecteur, pas un pointeur vers les éléments du vecteur. Par conséquent, vous devez écrire ceci:

(*mary)[5][5] = 777; 
+1

Depuis quand C a-t-il des vecteurs? – fredoverflow

+0

Depuis quand est similaire == même –

+0

Les pointeurs et les tableaux dans C ne sont PAS identiques, voir "Programmation Expert C." –

Questions connexes