each用法 - c++ vector foreach



每个C++,从矢量元素拉 (3)

我试图对一个攻击向量做一个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();
        }
    }
}

Answer #1

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);

Answer #2

对于下一个示例,假设您使用C ++ 11。 基于范围的for循环示例:

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

您应该使用const auto &attack具体取决于makeDamage()的行为。

您可以使用标准库+ lambdas中的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迭代器。


Answer #3

这是在C ++(11)的循环中完成的方式:

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

在C ++中没有。 另一个选择是使用std::for_each和一个合适的函子(这可以是任何可以使用Attack*作为参数调用的函数)。





each