возвращение std :: string с вектором - PullRequest
0 голосов
/ 31 июля 2010

Я пытаюсь получить "CMtoaPlugin :: listArnoldNodes ()", чтобы вернуть "массив" строк

   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);
   }

но это то, что я получаю, 2 записи, это правильно, но содержание записи не

инициализировать шейдер Арнольда † ¡/

инициализировать шейдер Арнольда.

что я делаю не так

Ответы [ 4 ]

7 голосов
/ 31 июля 2010

Вы не можете напечатать std :: string с помощью printf (или любого другого метода varargs). g ++ выдает здесь предупреждение:

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

Просто используйте cout:

std::cout << "initialize shader " << *it << std::endl;
6 голосов
/ 31 июля 2010

Другая возможность состоит в том, чтобы напечатать C-строку, соответствующую std::string, с помощью printf, например:

 printf("initialize shader %s\n", it->c_str());
4 голосов
/ 31 июля 2010

Попробуй так:

for (it = ArnoldNodes.begin() ; it != ArnoldNodes.end(); ++it)
{
    std::cout << "initialize shader " << *it << std::endl;
}
  • printf не работает с std::string, вам нужно использовать cout (или передать его it->c_str())
  • В цикле итератора for предпочтительно использовать it != vec.end() (поскольку нужно проверять равенство, а не сравнение) и ++it для увеличения (постинкремент может быть менее эффективным для некоторых итераторов).
0 голосов
/ 31 июля 2010

Когда вы выполняете цикл по всему диапазону итераторов, вы должны выполнять его, используя:

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

разница в том, что сравнение != вместо <, потому что container.end() итераторы возвращают один конец контейнера. Это не обязательно более «правильно», но более идиоматично.

...