C++ para cada uno, tirando de elementos vectoriales


Estoy tratando de hacer un foreach en un vector de ataques, cada ataque tiene un ID único digamos, 1-3.

El método de clase toma la entrada del teclado de 1-3.

Estoy tratando de usar un foreach para ejecutar a través de mis elementos en m_attack para ver si el número coincide, si lo hace... haz algo.

El problema que estoy viendo es este:

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

Estoy haciendo esto totalmente mal, tengo experiencia en C# y es en lo que estoy basando esto, cualquier ayuda sería apreciada.

Mi código es el siguiente:

En el encabezado

vector<Attack> m_attack;

En la clase

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();
        }
    }
}
Author: Springfox, 2013-02-22

4 answers

Para los siguientes ejemplos se supone que se utiliza C++11. Ejemplo con bucles for a distancia:

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

Debe usar const auto &attack dependiendo del comportamiento de makeDamage().

Puede usar std::for_each desde la biblioteca estándar + lambdas:

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

Si no se siente cómodo usando std::for_each, puede hacer un bucle sobre m_attack usando iteradores:

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

Use m_attack.cbegin() y m_attack.cend() para obtener iteradores const.

 96
Author: Ivan_Bereziuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-01 22:38:06

Así es como se haría en un bucle en C++(11):

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

No hay for each en C++. Otra opción es usar std::for_each con un funtor adecuado (esto podría ser cualquier cosa que se pueda llamar con un Attack* como argumento).

 16
Author: juanchopanza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-30 21:48:01

La sintaxis for each se admite como una extensión de c++ nativo en Visual Studio.

El ejemplo proporcionado en 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;
}

(funciona en VS2013) no es portable/multiplataforma, pero le da una idea de cómo usar for each.

Las alternativas estándar (proporcionadas en el resto de las respuestas) se aplican en todas partes. Y sería mejor usarlas.

 6
Author: Nikos Athanasiou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-03 21:04:59

C++ no tiene la característica de bucle for_each en su sintaxis. Tienes que usar c++11 o usar la función de plantilla 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);
 4
Author: andre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-22 15:30:20