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迭代器.
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参数调用的东西).
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.
标准备选方案(在其余答案中提供)适用于所有地方.最好使用那些.
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)