web-dev-qa-db-ja.com

各C ++、ベクトル要素から取得

私は攻撃のベクトルでforeachを実行しようとしています。各攻撃には一意のIDたとえば1-3があります。

クラスメソッドは、キーボード入力1〜3を受け取ります。

Foreachを使用してm_attackの要素を実行し、数値が一致するかどうかを確認しようとしています。

私が見ている問題はこれです:

a'for each' statement cannot operate on an expression of type "std::vector<Attack

私はこれについてまったく間違っていますか、私はC#の経験があり、これを基にしているようなものです、どんな助けも感謝します。

私のコードは次のとおりです。

ヘッダー内

vector<Attack> m_attack;

クラスで

int Player::useAttack (int input)
{

    for each (Attack* attack in m_attack) // Problem part
    {  
        //Psuedo for following action
        if (attack->m_num == input)
        {
            //For the found attack, do it's damage
            attack->makeDamage();
        }
    }
}
52
Springfox

次の例では、C++ 11を使用することを想定しています。範囲ベースのforループの例:

for (auto &attack : m_attack) // access by reference to avoid copying
{  
    if (attack->m_num == input)
    {
        attack->makeDamage();
    }
}

makeDamage()の動作に応じて、const auto &attackを使用する必要があります。

標準ライブラリ+ラムダのstd::for_eachを使用できます。

std::for_each(m_attack.begin(), m_attack.end(),
        [](Attack * attack)
        {
            if (attack->m_num == input)
            {
                attack->makeDamage();
            }
        }
);

std::for_eachを使用して不快な場合は、イテレーターを使用してm_attackをループできます。

for (auto attack = m_attack.begin(); attack != m_attack.end(); ++attack)
{  
    if (attack->m_num == input)
    {
        attack->makeDamage();
    }
}

m_attack.cbegin()およびm_attack.cend()を使用して、constイテレータを取得します。

124
user425495

これは、C++(11)のループで行われる方法です。

   for (const auto& attack : m_attack)
    {  
        if (attack->m_num == input)
        {
            attack->makeDamage();
        }
    }

C++にはfor eachはありません。別のオプションは、適切なファンクターで std :: for_each を使用することです(これは、Attack*を引数として呼び出すことができるものであれば何でもかまいません)。

21
juanchopanza

for each構文は、Visual Studioのネイティブc ++の拡張機能としてサポートされています。

msdn で提供されている例

#include <vector>
#include <iostream>

using namespace std;

int main() 
{
  int total = 0;

  vector<int> v(6);
  v[0] = 10; v[1] = 20; v[2] = 30;
  v[3] = 40; v[4] = 50; v[5] = 60;

  for each(int i in v) {
    total += i;
  }

  cout << total << endl;
}

(VS2013で動作します)はポータブル/クロスプラットフォームではありませんが、for eachの使用方法のアイデアを提供します。

標準的な代替案(残りの回答で提供)はどこでも適用されます。そして、それらを使用するのが最善でしょう。

10

C++の構文には、for_eachループ機能がありません。 c ++ 11を使用するか、テンプレート関数std::for_eachを使用する必要があります。

struct Function {
    int input;
    Function(int input): input(input) {}
    void operator()(Attack& attack) {
        if(attack->m_num == input) attack->makeDamage();
    }
};
Function f(input);
std::for_each(m_attack.begin(), m_attack.end(), f);
5
andre