c++ - 同一 multimap 中的嵌套迭代

标签 c++ nested iteration multimap

我正在尝试对我的游戏对象进行碰撞检查。我有一个 multimap,它在每个键中包含相同类型的对象。键代表对象的类型。但是,所有类型都派生自同一个类。我需要将它们分开,以便当一种类型的对象接触到另一种类型的另一个对象时,这些对象知道该怎么做。但是我检查碰撞的方法似乎很慢,因为我注意到我添加的对象越多,它们移动的越慢。谁能帮我? :(

具体代码如下:

void CheckCollisions()
{
    if (!Actors.empty())
    {
        std::multimap<std::string, boost::shared_ptr<std::vector<PActor>>>::const_iterator it;
        it = Actors.begin();
        while (it != Actors.end())
        {
            for (int i = 0; i < static_cast<int>(it->second->size()); i++)
            {
                std::multimap<std::string, boost::shared_ptr<std::vector<PActor>>>::const_iterator it2;
                it2 = Actors.begin();
                while(it2 != Actors.end())
                {
                    for (int j = 0; j < static_cast<int>(it2->second->size()); j++)
                    {
                        if (i != j)
                        {
                            if (Touch(it->second->at(i), it2->second->at(j)))
                            {
                                it->second->at(i)->Touch(it2->first, it2->second->at(j));
                                it2->second->at(j)->Touch(it->first, it->second->at(i));
                            }
                        }
                    }
                    it2++;
                }
            }
            it++;
        }
    }
}

注意: PActor 只是 Actor 的一个 shared_ptr;

最佳答案

碰撞检测就是要最大限度地减少您必须执行的检查次数。例如,你不应该检查每个 Actor 与其他 Actor ,除非你的 Actor 很少。这是一个 O(N^2) 算法,在添加 Actor 时不能很好地扩展(双倍的数字需要四倍的时间)。也许你知道每个 Actor 的身材?然后你可以尝试与这个范围内的 Actor 碰撞。有一个图书馆叫ANN可用于快速找到最近的邻居。

祝你好运!

关于c++ - 同一 multimap 中的嵌套迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8645708/

相关文章:

java - 为什么我们不能在没有花括号的 while 循环之后使用声明语句?

javascript - meteor 迭代一组 session 以检查值是否已更改

C++:多态成员可以保持不变吗?

c++ - 关于我的第一个使用 Boost 库的程序的问题(异常(exception),长路径)

c++ - Boost Graph Library 动态边权重

css - 使用 SASS 嵌套的优点

python - 对嵌套列表值求和的函数?

c++ - OpenCV imread 问题

c++ - 最终类的嵌套类是否自动最终?

python - 有没有一种方法可以对当前迭代 Pandas 数据帧中的行的代码进行矢量化?