2012-05-31 5 views
0

Salut, je dois stocker les informations mentionnées ci-dessous dans un vecteur de format vecteurs ...comment stocker vecteur de vecteur par index

vector <vector <int>> ph; 
vector<int> p, q; 
p.push_back(1); 
p.push_back(2); 
p.push_back(3); 

q.push_back(10); 
q.push_back(20); 
q.push_back(30); 
q.push_back(40); 

maintenant au lieu d'utiliser:

ph.push_back(p); 
ph.push_back(q); 

Je veux à utiliser:

ph.at(0)=p 
ph.at(1)=q 

(Ceci est l'erreur que je reçois lorsque j'utilise ceci: fin a appelé après avoir jeté une instance de ' std :: out_of_range ' what(): vecteur :: _ M_range_check)

La raison pour laquelle je veux le stocker de cette façon est .... plus tard, je veux accéder aux éléments d'un vecteur particulier identifié par son indice à savoir 1 ou 0.

Par exemple, je souhaite accéder à ph [0] .size() c'est-à-dire la taille de p ... identifiée par son index. C'est-à-dire que je veux effectuer la même opération que nous sommes capables de faire dans le cas de tableaux simples en C++, c'est-à-dire stocker les données de ce tableau à un index particulier et accéder aux données d'un index particulier.

+1

Vous venez de rétablir les modifications de marquage pour le plaisir ...? Le sujet de votre question ne concerne pas l'espace de noms 'std ::' d'une façon pertinente ... thinkaboutit. Vous pourriez le marquer «taille» ou «obtenir» ou «le» ou «élément» ou «accès» et cela ne serait pas utile non plus. – HostileFork

+1

@HostileFork En outre, 'stl' n'est probablement pas pertinent ici, car il est plus que probable que les' vecteurs' en question sont des vecteurs de bibliothèque standard C++, pas ceux de la bibliothèque STL. – juanchopanza

+0

@juanchopanza Touche. Cela me fait mal de penser que même avec un système d'étiquettes sémantiques complet, avec des hiérarchies basées sur la connaissance, nous n'obtiendrons probablement pas la perfection ... cela a probablement quelque chose à voir avec la physique quantique. :-P http://commontag.org/Home – HostileFork

Répondre

2

Vous obtenez l'erreur car lorsque vous instanciez le vecteur de vecteurs, il a la taille 0 et la méthode at() est autorisé à effectuer des vérifications liées et déclencher une exception.

Si vous voulez accéder par index comme ça, alors vous êtes mieux avec std::map ou std::unordered_map. Cela rend l'indépendance de l'indice de l'ordre d'insertion:

std::map<int, std::vector<int>> MapOfVectors; 
std::vector<int> p, q; 
// fill vectors 
MapOfVectors[1] = q; 
MapOfVectors[0] = p; 

Sinon, vous devez vous assurer que votre vecteur de vecteurs est assez grand pour insérer des éléments par index:

// instantiate vector with size 2. You can insert p and q by index. (0, 1) only 
vector<vector<int>> ph(2); 

Ou, redimensionner après la création:

vector<vector<int>> ph; 
ph.resize(2); 
+0

S'il vous plaît jeter un oeil à la poste http://stackoverflow.com/a/6320285/1354510 Ici, la personne tente d'accéder à la taille d'un vecteur de vecteur de bords. ..Je doute comment c'est fait ... Je veux dire comment est-il possible de le faire pendant le stockage. Merci aussi beaucoup d'aide ... s'il vous plaît être aimable pour effacer mon doute – user1354510

+0

@ user1354510 dans cet exemple, en haut de la fonction dijkstra vecteur «d» est initialisé pour être de taille «n-1», d'une manière similaire à mon deuxième extrait de code. – juanchopanza

0

Lorsque vous définissez vector<vector<int>> ph le vecteur ph est vide. La fonction membre .at() effectue la vérification des limites et déclenche correctement une exception lorsque vous essayez d'écrire dans des éléments inexistants.

Vous pouvez faire ph.resize(2) de sorte que les index 0-1 soient alors valides ou simplement utiliser push_back comme vous le faites actuellement.

0

Je veux utiliser:

ph.at(0)=p ph.at(1)=q 

qui tente d'accéder à des indices après la fin du tableau, donc l'exception.

La raison pour laquelle je veux stocker cette façon est .... plus tard, je veux accéder aux éléments d'un vecteur particulier identifié par son indice de référence: 1 ou 0.

Par exemple, je désire access ph [0] .size() ie la taille de p ... identifiée par son index. C'est-à-dire que je veux effectuer la même opération que nous sommes capables de faire dans le cas de tableaux simples en C++, c'est-à-dire stocker les données de ce tableau à un index particulier et accéder aux données d'un index particulier.

Vous pouvez y parvenir en remplissant d'abord le vecteur externe avec des vecteurs intérieurs vides:

vector<vector<int> > ph(2); 

Ici, le 2 dit pour construire le vecteur externe pour contenir 2 éléments par défaut construit (eux-mêmes vector<int>).

Alternativement, vous pouvez utiliser:

vector<vector<int> > ph; 
ph.resize(2); 

Une fois que vous avez fait cela, il sera en sécurité pour accéder aux éléments pour stocker des valeurs construites par défaut. Cela signifie que les éléments suivants ne seront pas lancés:

ph.at(0)=p; ph.at(1)=q;