82

我正在尝试对攻击向量进行 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();
        }
    }
}
4

4 回答 4

188

对于下一个示例,假设您使用 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().

您可以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()andm_attack.cend()获取const迭代器。

于 2013-02-22T15:38:29.587 回答
26

这是在 C++(11) 中循环执行的方式:

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

C++中没有for each。另一种选择是将std::for_each与合适的仿函数一起使用(这可以是任何可以用Attack*as 参数调用的东西)。

于 2013-02-22T15:19:32.190 回答
12

支持该for each语法作为 Visual Studio 中本机 c++ 的扩展。

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.

标准替代方案(在其余答案中提供)适用于任何地方。最好使用这些。

于 2014-05-03T21:04:59.123 回答
5

for_eachC++在其语法中没有循环功能。您必须使用 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);
于 2013-02-22T15:30:20.090 回答