2010-11-22 27 views
2

J'ai std::vector qui contient ma propre classe et je dois accéder à ses fonctions et les vides.C++ accédant vecteur

class A 
{ 
private: 
    int var; 
    vector<string> vec; 

public: 
    void setVar(int i) { var = i; } 
    void setVec(vector<string> a) { vec = a; } 
}; 

J'ai aussi des fonctions de retour mais je n'ai pas pris la peine de les taper. Et j'ai inclus tous les fichiers nécessaires.

int main() 
{ 
    vector<A> vec; 
    for (int i = 0; i < 10; i++) 
    { 
     A tmp; 
     tmp.setVar(i); 
     vec.push_back(tmp); 
    } 

    for (int i = 0; i < 10; i++) 
    { 
     vector<string> tmp; 
     tmp.push_back("1"); 
     tmp.push_back("2"); 
     tmp.push_back("3"); 
     vec.at(i).setVec(tmp); //Works sometimes or causes error std::out_of_range 
     vec[i].setVec(tmp);  //Crashes the whole programm 
    } 
} 

Alors, comment puis-je configurer ces variables depuis le vector est initialisé? J'utilise g ++ et ce n'est pas du vrai code parce que mon code actuel est en désordre.

Error for vec.at(i).setVec(tmp); 
Error is: terminate called after throwing an instance of 'std::out_of_range' 
    what(): vector::_M_range_check 
+0

Ce code ne sera pas compilé pour moi. Etes-vous sûr que la configuration de 'tmp' est votre code actuel? Quand je corrige cela pour faire quelque chose de valable pour mettre en place 3 'string's dans le' vector', ce code fonctionne bien. –

+1

Avec le code mis à jour, je ne vois aucune raison que cela devrait échouer. Est-ce que le code que vous avez écrit ici tombe en panne pour vous? –

Répondre

2

Quel compilateur utilisez-vous? Je suis vraiment très surpris que std::vector<std::string> tmp("1","2","3"); compile même!

Pour être honnête, je ne sais pas ce qu'il appelle, mais je parie qu'il ne fait pas ce que vous attendez, que je crois est:

std::vector<std::string> tmp; 
tmp.push_back("1"); 
tmp.push_back("2"); 
tmp.push_back("3"); 

Pour mémoire, boost.assign et C++0x fournit le genre de l'initialisation du conteneur que vous essayiez d'atteindre.

+2

Je crois que c'est un code composé. S'il tapait 'vecteur tmp (" 1 "," 2 ");' il aurait compilé mais il ne fait pas ce qui est attendu. – ereOn

+0

Ce n'était pas mon code actuel. Je l'ai fait pour clarifier le sens. Je vais arranger ça. –

2

Le code que vous avez posté ne sera toujours pas compilé (pas de tmp déclaré dans la première boucle), alors laissez-moi vous expliquer en général ce qui se passe.

Il y a deux erreurs types que vous avez mentionnés:

vec.at(i).setVec(tmp); //Works sometimes or causes error std::out_of_range 

La fonction at essaie d'être en sécurité - il vérifie d'abord la longueur du vecteur, puis retourne l'élément de l'indice donné, ou lancers francs std::out_of_range si la le vecteur ne contient pas l'élément d'un tel index.

Le second cas:

vec[i].setVec(tmp);  //Crashes the whole programm 

opérateur [] se comporte comme la fonction at() pour les vecteurs, mais pas « sûr » comme il ne fait pas de bornes-vérification. Par conséquent, si vous essayez d'accéder au 4ème élément d'un 3-élément, vous accédez simplement à un endroit aléatoire de votre mémoire (il pourrait s'agir d'une autre variable sans rapport, par exemple, qui pourrait être autre chose). Si vous avez de la chance, votre programme va planter après cela. Si vous êtes malchanceux, vous aurez des problèmes de corruption de mémoire et des bugs très étranges, difficiles à trouver.

La solution à votre problème est:

a) Remplacer vec[i] avec vec.at(i) - fonctionnent de la même (bien, un petit peu plus lent, mais vous ne sentirez pas que) et vous êtes sûr . B) Ensuite: Regardez tous les endroits où vous effectuez cette recherche de vecteurs et dans chaque endroit arrêtez-vous une seconde et considérez: "Quelle est la taille de ce vecteur en ce moment? Je suis sûr que l'élément de cet index existe? ".

Vous allez probablement trouver votre bug rapidement de cette façon.

1

J'ai essayé votre code dans VS2010 et je n'ai pas pu reproduire le problème que vous avez décrit.Sûrement, le passage de vecteur par valeur n'est pas une bonne idée, cela devrait être une référence à une constante, mais cela ne peut pas causer une telle erreur. Si l'on prend 'std :: out_of_range', la cause la plus probable est qu'il n'y a pas d'élément avec un tel index dans votre vecteur. Pour tester, vous pouvez vérifier si i < vec.size() avant d'accéder à vec[i] (ou vec.at(i))

0

J'ai trouvé un problème. C'était en fonction qui traitait la taille du vecteur. Apparemment, le vecteur était vide. Erreur muette. Merci à tous pour vos réponses.