使用remove_if和lambda表达式列出擦除

时间:2015-02-16 15:34:17

标签: c++ list stl

[编辑] 发现的主要问题与此代码无关,但对我对此方法的看法感到好奇。

我有一个基于磁贴的游戏。所以我有一个2D数组用于地图,但我也有具有世界位置的对象。我将对象存储在列表中(不在2D地图数组中),当对象不在视图中时,我想从列表中删除该对象。我决定"不在视野中#34;通过从其位置找到对象所在的图块,如果该图块在图块之外,我可以看到它不再对我可见,因此将其删除。我这样做是因为这是一个多人游戏,服务器正在向我传输我可以看到的瓦片中的对象,客户端将这些对象插入到此列表中但是当我四处移动时,我不再需要那些在我看来之外的对象。如果我回到他们的视图中,服务器就会知道这一点并将它们再次发送给我。我基本上只是让客户保持高效,只保留可见的东西。

要删除我视图之外的对象,我有以下代码,但这只是保持循环,即使我在项目中只有1个对象。我错过了什么?

items.erase(remove_if(items.begin(), items.end(), [this, playerTile, subArrayCenter](Item e) -> bool { 
        // find out what tile this item is on based on it's position
        Vec2 tile = WorldToTile(e.entity->GetPosition());

        // if this item is outside the player view then remove it
        if (tile.y < playerTile.y - subArrayCenter || tile.y > playerTile.y + subArrayCenter || tile.x < playerTile.x - subArrayCenter || tile.x > playerTile.x + subArrayCenter)
            return true;

        return false;
    }), items.end());

在我的情况下它是假的,这对于我移动的地方是正确的,但我不确定为什么它会不止一次地进入这里。

0 个答案:

没有答案