С++ для каждого, вытягивание из векторных элементов
Я пытаюсь сделать 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();
}
}
}
Ответы
Ответ 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
.
Стандартные альтернативы (предоставленные в остальных ответах) применяются повсеместно. И было бы лучше использовать их.