0


1

ベクトルとともにstd :: stringを返す
文字列の「配列」を返すために「CMtoaPlugin

listArnoldNodes()」を取得しようとしています

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

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

しかし、これは私が得るものです、2つのエントリ、それは正しいですが、エントリの内容はそうではありません

Arnoldシェーダーの初期化†¡/

Arnoldシェーダーを初期化します。

私は何を間違えていますか

4 Answer


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;


6


別の可能性は、次のように、 `stdf

string`に対応するC-stringを` printf`で出力することです:

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


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(一部のイテレータではポストインクリメントの効率が低下する場合があります)。


0


イテレータ範囲全体でforループする場合は、次を使用して実行する必要があります。

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

違いは、比較が `<`ではなく `!=`であることです。これは、 `container.end()`イテレータがコンテナの末尾の1つ前を返すためです。 必ずしも「正しい」とは限りませんが、より慣用的です。