2010-07-30 40 views
0

Je suis en train de faire « CMtoaPlugin :: listArnoldNodes() » pour retourner un « tableau » de chaînesrenvoie une std :: string avec un vecteur

std::vector<std::string> ArnoldNodes = CMtoaPlugin::listArnoldNodes(); 
    std::vector<std::string>::iterator it; 

    for (it=ArnoldNodes.begin() ; it < ArnoldNodes.end(); it++) 
    { 
     printf("initialize shader %s\n", *it); 
    } 

mais ce que je reçois, 2 entrées , c'est exact, mais le contenu de l'entrée n'est pas

initialiser shaders Arnold † ¡/

initialiser Arnold shaders.

ce que je fais mal

+1

Vous devrez nous montrer le code dans listArnoldNodes(). – Starkey

Répondre

4

Essayez comme ceci:

for (it = ArnoldNodes.begin() ; it != ArnoldNodes.end(); ++it) 
{ 
    std::cout << "initialize shader " << *it << std::endl; 
} 
  • printf ne fonctionne pas avec std::string, vous devez utiliser cout (ou de le transmettre it->c_str())
  • Dans un itérateur pour la boucle, il est préférable d'utiliser it != vec.end() (puisque vous ne devez vérifier pour l'égalité, pas comparer), et ++it pour incrémenter (le post-incrément peut être moins efficace pour certains itérateurs).
7

Vous ne pouvez pas imprimer un std :: string avec printf (ou toute autre méthode varargs). g ++ donne un avertissement ici:

warning: cannot pass objects of non-POD type ‘struct std::string’ through ‘...’; call will abort at runtime 

utiliser juste Cout:

std::cout << "initialize shader " << *it << std::endl; 
6

Une autre possibilité est d'imprimer la chaîne C correspondant à std::string avec printf, comme ceci:

printf("initialize shader %s\n", it->c_str()); 
0

Lorsque vous pour boucle dans votre gamme de iterator, vous devriez l'exécuter en utilisant:

for (it = ArnoldNodes.begin() ; it != ArnoldNodes.end(); it++) 
{ /*...*/ } 

la différence est que la comparaison est != au lieu de <, parce container.end() itérateurs retour d'un passé- l'extrémité du conteneur. Ce n'est pas forcément plus "correct", mais c'est plus idiomatique.

+0

True; la raison, cependant, n'est pas que 'container.end()' est passé-la-fin, mais parce que les boucles écrites avec '<' ne fonctionnent que pour RandomAccessIterators, alors que '! =' fonctionne pour chacune d'elles. – jpalecek