-2

新しいISOが発効する前に他の誰かによって書かれたコードがあります。

構文の一部が原因で、 forLOOPinfor (pa=a.begin(), i=0; pa != a.end(); ++pa)の実行に少し問題があります。i=0また、他のforループ構文for ( int i .....)int前に.を付ける必要がありましたiint i=0ただし、この行 のを修正する方法がわかりませんfor (pa=a.begin ( ), i=0; pa != a.end ( ); ++pa)。私を助けてください。

  for ( int i = 0; pa != a.end(); ++pa)
      *pa = ++i;

  for (int i=0; i<10; i++)
      std::cout << "a[" << i << "]=" << a[i] << std::endl;

  // int i;  // note that this will work, but I do not want this extra line.

  for (pa=a.begin(), i=0; pa != a.end(); ++pa)
      std::cout << "a[" << i++ << "]=" << *pa << std::endl;
4

2 に答える 2

4

ループ外の追加の宣言forは、C++98以降のバージョンの言語で無関係なタイプの2つの反復変数を使用するための唯一の賢明な方法です。初期化子は単一の式または単一の宣言のいずれかであり、宣言は複数の無関係な型の変数を宣言することはできません。

この状況で本当にワンライナーが必要な場合は、この怪物を使用できます。

for (int i = ((pa = a.begin()), 0); pa != a.end(); ++pa, ++i)

そのようなことを定期的に行う場合は、コードを管理している人があなたの住んでいる場所を知らないようにしてください。

于 2012-07-04T12:53:36.577 に答える
3

いいえ、内で宣言できるのは1つのタイプの変数のみですfor。問題がスコープである場合は、ループをブロック内に含めることができます(いくつかの良い例については、ループマクロのブーストソースコードを参照してください)。

for ( int i = 0; pa != a.end(); ++pa)
    *pa = ++i;

for (int i=0; i<10; i++)
    std::cout << "a[" << i << "]=" << a[i] << std::endl;

{
    int i = 0;
    for (pa=a.begin(); pa != a.end(); ++pa)
        std::cout << "a[" << i++ << "]=" << *pa << std::endl;
}

あなたが単にそれをもっと素敵にしたいのなら、答えはノーです、あなたはできません

編集あなたが必要なことをし、それを明確に保つために私が見た最高のトリックは、SOの
この答えあります。複数の変数の代わりに、インラインで宣言された名前のない構造体を使用できます。

for (struct { int i; iterator it; } d = { 0, pa.begin() }; d.it != a.end(); ++d.i, ++d.it )
    std::cout << "a[" << d.i << "]=" << *d.it << std::endl;

それはもう少しプロリックスです(余分な行で節約したものは返済されるのだろうか)が、意図を明確にし、コードを読みやすくします(さらに、任意の数と任意のタイプの変数をパック するために使用できます) 。

于 2012-07-04T12:47:08.477 に答える