繁体   English   中英

返回带有向量的std :: string

[英]returning a std::string with an vector

我正在尝试获取“ 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着色器。

我究竟做错了什么

您不能使用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;

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

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

像这样尝试:

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可以递增(某些迭代器的后递增效率可能较低) )。

在迭代器范围内进行循环时,应使用以下命令执行:

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

区别在于比较是!=而不是< ,因为container.end()迭代器返回的是容器的最后一点。 它不一定更“正确”,但是更惯用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM