每个C++,从矢量元素拉

Spr*_*fox 55 c++ each for-loop vector

我试图在一个攻击向量上做一个foreach,每个攻击有一个唯一的ID,1-3.

类方法采用1-3的键盘输入.

我试图使用foreach在m_attack中运行我的元素以查看数字是否匹配,如果它确实...做某事.

我看到的问题是:

a'for each' statement cannot operate on an expression of type "std::vector<Attack
Run Code Online (Sandbox Code Playgroud)

我是否完全错了,我有C#的经验,并且是我的基础,任何帮助都将受到赞赏.

我的代码如下:

在标题中

vector<Attack> m_attack;
Run Code Online (Sandbox Code Playgroud)

在班上

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 131

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

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

您应该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();
            }
        }
);
Run Code Online (Sandbox Code Playgroud)

如果您使用不舒服std::for_each,可以m_attack使用迭代器循环:

for (auto attack = m_attack.begin(); attack != m_attack.end(); ++attack)
{  
    if (attack->m_num == input)
    {
        attack->makeDamage();
    }
}
Run Code Online (Sandbox Code Playgroud)

使用m_attack.cbegin()m_attack.cend()获取const迭代器.

  • 在您的第一个示例中,“auto&amp;attack”不是暗示“attack.m_num”和“attack.makeDamage()”而不是箭头符号吗? (3认同)

jua*_*nza 22

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

   for (const auto& attack : m_attack)
    {  
        if (attack->m_num == input)
        {
            attack->makeDamage();
        }
    }
Run Code Online (Sandbox Code Playgroud)

for each在C++中没有.另一个选择是使用std :: for_each和一个合适的函子(这可以是任何可以用Attack*as参数调用的东西).

  • [`for each`](http://blogs.msdn.com/b/arich/archive/2004/09/08/227139.aspx)是VS原生c ++中受支持的扩展名 (3认同)

Nik*_*iou 11

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;
}
Run Code Online (Sandbox Code Playgroud)

(适用于VS2013)不是便携式/跨平台,但可以让您了解如何使用for each.

标准备选方案(在其余答案中提供)适用于所有地方.最好使用那些.


and*_*dre 5

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);
Run Code Online (Sandbox Code Playgroud)