C ++对每个,从向量元素拉(C++ for each, pulling from vector e

2019-07-20 09:33发布

我试图做的攻击向量的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 ++ 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从标准库+ lambda表达式:

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 2:

这是怎么回事就在在C回路来完成++(11):

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

没有for each在C ++中。 另一种选择是使用的std :: for_each的用合适的仿函数(这可能是任何可以与被称为Attack*作为参数)。



Answer 3:

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

标准的替代品(在答案的其余部分提供)适用于任何地方。 这将是最好用的。



Answer 4:

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


文章来源: C++ for each, pulling from vector elements