【问题标题】:C++ for each, pulling from vector elements每个 C++,从向量元素中提取
【发布时间】:2013-02-08 06:05:46
【问题描述】:

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

【问题讨论】:

  • 可以使用函数std::for_each
  • 一种不同的方法,但是:std::map&lt;int, Attack*&gt; attacks; 和方法中:attacks[input]-&gt;makeDamage();(在尝试捕获 out_of_range 异常)。

标签: c++ for-loop vector each


【解决方案1】:

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

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

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

【讨论】:

  • for each 是 VS 原生 c++ 中支持的扩展
【解决方案2】:

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

【讨论】:

  • 这对我很有帮助,谢谢,我几乎可以正常工作了,但我需要让它返回一个 int 的方法。我正在尝试,我已经尝试过,但无法弄清楚如何在返回的正确位置引用指针,您能否编辑您的答案以帮助解决这个问题?
  • @Springfox 如果需要,您可以将额外的成员变量添加到结构中,并在以后使用 f.method(...); 访问它们;
  • 为什么不在 m_attack 上使用 std::begin/std::end?
  • for each 是 VS 原生 c++ 中支持的扩展
【解决方案3】:

接下来的示例假设您使用 C++11。 基于范围的 for 循环示例:

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

您应该根据makeDamage() 的行为使用const auto &amp;attack

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

【讨论】:

  • 啊,那是我当时正在寻找的标题,我正在为它寻找库。谢谢。
  • 第二个正是我所追求的,更重要的是我理解 ;)。谢谢你,明白了。
  • @Justin Shrake :可能想解释为什么在范围 for 循环中按引用传递可能(但不总是)比按副本传递更可取。
  • 我正在复习我的 C++,所以如果你使用引用,它会避免复制有问题的对象吗?指针呢?
  • 在您的第一个示例中,auto&amp; attack 是否暗示 attack.m_numattack.makeDamage() 而不是箭头符号?
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    相关资源
    最近更新 更多