0

我试图让“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

4 回答 4

7

您不能使用 printf (或任何可变参数方法)打印 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;
于 2010-07-30T22:10:52.767 回答
6

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

 printf("initialize shader %s\n", it->c_str());
于 2010-07-30T22:13:56.767 回答
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增量(对于某些迭代器来说,后增量可能效率较低)。
于 2010-07-30T22:17:26.603 回答
0

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

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

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

于 2010-07-30T22:31:58.097 回答