for_each C++ Problem

for_each C++ Problem

本文关键字:Problem C++ each for      更新时间:2023-10-16

我对C++中的for each循环感到困惑。我在一个主要的游戏循环中有这样的代码:

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

我在C#中也遇到过这个问题,它让我疯狂了一段时间。根据我的发现,for each循环为集合中的每个对象创建一个新对象。因此,它是通过值而不是通过引用来创建的(如果您使用循环的标准),这会导致原始集合不受影响。我总是发现每个循环都适合阅读,但不适合更新。

通过引用更改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();
});

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

for(type identifier : expression)

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

然而,在C++03中,并没有专门针对每个循环语言结构。

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