una - sumar elementos de un vector c++
C++ para cada uno, extrayendo elementos del vector (4)
Así es como se haría en un ciclo 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 functor adecuado (esto podría ser cualquier cosa que se pueda llamar con un Attack*
como argumento).
Estoy tratando de hacer un foreach en un vector de ataques, cada ataque tiene una ID única , digamos, 1-3.
El método de clase toma la entrada de teclado de 1-3.
Estoy tratando de utilizar un foreach para ejecutar mis elementos en m_attack para ver si el número coincide, si lo hace ... hacer algo.
El problema que estoy viendo es esto:
a''for each'' statement cannot operate on an expression of type "std::vector<Attack
Estoy haciendo esto completamente mal, tengo experiencia C # y es algo de lo que estoy basando esto, cualquier ayuda sería apreciada.
Mi código es el siguiente:
En 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();
}
}
}
C ++ no tiene la función for_each
loop 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);
El for each
sintaxis 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 portátil / multiplataforma, pero te da una idea de cómo usarlo for each
.
Las alternativas estándar (proporcionadas en el resto de las respuestas) se aplican en todas partes. Y sería mejor usar esos.
Para los ejemplos siguientes se supone que usa C ++ 11. Ejemplo con bucles basados en rangos:
for (auto &attack : m_attack) // access by reference to avoid copying
{
if (attack->m_num == input)
{
attack->makeDamage();
}
}
Deberías 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 al usar std::for_each
, puede recorrer repetidamente m_attack
utilizando iteradores:
for (auto attack = m_attack.begin(); attack != m_attack.end(); ++attack)
{
if (attack->m_num == input)
{
attack->makeDamage();
}
}
Utilice m_attack.cbegin()
y m_attack.cend()
para obtener iteradores const
.