Подтвердить что ты не робот

С++ для каждого, вытягивание из векторных элементов

Я пытаюсь сделать foreach на векторе атак, каждая атака имеет уникальный идентификатор, скажем, 1-3.

Метод класса принимает ввод с клавиатуры на 1-3.

Я пытаюсь использовать foreach для выполнения своих элементов в m_attack, чтобы узнать, совпадает ли число, если оно... что-то делает.

Проблема, которую я вижу, такова:

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

Я собираюсь сделать это совершенно неправильно, у меня есть опыт работы на С#, и это то, что я основываю на этом, любая помощь будет оценена по достоинству.

Мой код выглядит следующим образом:

В заголовке

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 damage
            attack->makeDamage();
        }
    }
}
4b9b3361

Ответ 1

В следующих примерах предполагается, что вы используете С++ 11. Пример с циклами для диапазона:

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

Вы должны использовать const auto &attack в зависимости от поведения makeDamage().

Вы можете использовать std::for_each из стандартной библиотеки + lambdas:

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.

Ответ 2

Вот как это было бы сделано в цикле в С++ (11):

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

В С++ нет for each. Другой вариант - использовать std:: for_each с подходящим функтором (это может быть все, что можно вызвать с аргументом Attack* в качестве аргумента).

Ответ 3

С++ не имеет функции цикла for_each в своем синтаксисе. Вы должны использовать С++ 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);

Ответ 4

Синтаксис for each поддерживается как расширение для родного С++ в Visual Studio.

Пример, приведенный в 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.

Стандартные альтернативы (предоставленные в остальных ответах) применяются повсеместно. И было бы лучше использовать их.