for_each C ++问题

时间:2011-06-24 20:39:02

标签: c++ foreach

我对C ++中的每个循环感到困惑。我在主游戏循环中有这个代码:

for each (Bubble b in bubbles){
    b.Update();
}
for each (Bubble b in bubbles){
    b.Draw();
}

它没有更新任何东西,但确实画了1个泡泡..它有什么问题?

编辑:此代码有效

struct BubbleUpdater {
void operator()(Bubble & b) { b.Update(); }
} updater;
struct BubbleDrawer {
void operator()(Bubble & b) { b.Draw(); }
} drawer;

void OnTimer(){ //this is my main game loop
    std::for_each(bubbles.begin(),bubbles.end(),drawer);
    std::for_each(bubbles.begin(),bubbles.end(),updater);
}

4 个答案:

答案 0 :(得分:3)

我在C#中也有这个问题,它让我疯了一会儿。根据我的发现,for循环为集合中的每个对象创建一个新对象。所以它是通过值创建的,而不是通过引用(如果你使用标准for循环),这导致原始集合不受影响。我总是发现每个循环都适合阅读,但不能用于更新。

答案 1 :(得分:2)

更改您的BubbleUpdater类以通过引用接受它的参数

struct BubbleUpdater {
void operator()(Bubble & b) { b.Update(); }
} updater;

这样,您对std::for_each的调用就可以了。

如果您的编译器支持它(和VC10一样),那么您可以使用lambdas而不是创建一个远程函数对象类。是的,它是标准的c ++,或者很快就会出现。

std::for_each (bubbles.begin(), bubbles.end(), [](Bubble & b){
    b.Update();
});

答案 2 :(得分:1)

for each无效c ++,如果您考虑std::for_each()BOOST_FOREACH,则它们的语法不同。

std::for_each是一个函数,具有以下接口:

std::for_each(InputIterator begin, InputIterator end, function f);

BOOST_FOREACH是预处理器宏,具有以下接口:

BOOST_FOREACH(element e, container c)
{
do_thing(e);
e.whatever();
}

答案 3 :(得分:1)

这不是C ++,它是内存中的Qt扩展。每个循环的新C ++ 0x将具有语法

for(type identifier : expression)

for(auto x : std::string("ohai"))

但是,在C ++ 03中,没有专门用于每个循环语言构造。