使用向量返回std :: string

时间:2010-07-30 22:06:29

标签: c++ iteration stdstring stdvector

我正试图让“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个条目,这是正确的,但条目的内容不是

初始化Arnold着色器†¡/

初始化Arnold着色器。

我做错了什么

4 个答案:

答案 0 :(得分:7)

您无法使用printf(或任何varargs方法)打印std :: string。 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;

答案 1 :(得分:6)

另一种可能性是使用std::string打印与printf对应的C字符串,如下所示:

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

答案 2 :(得分:4)

试试这样:

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要增加(后增量可能效率较低)一些迭代器)。

答案 3 :(得分:0)

当你在迭代器范围内循环时,你应该使用:

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

不同之处在于比较是!=而不是<,因为container.end()迭代器返回容器的一个结尾。它不一定更“正确”,但它更具惯用性。