地图与std :: pair地图的优点是什么?

问题描述:

以下制作地图的方式有哪些优点和缺点,以表示二维网格。网格应该可以在任何时候填充,而不需要为整个事物分配内存,这就是为什么我不使用二维数组的原因。地图与std :: pair地图的优点是什么?

std::map<int, std::map<int, Tile*>* >* tiles; 

std::map<std::pair<int, int>, Tile*>* tiles; 

或者如果你有另一个更好的主意让我知道。对不起,如果这是一个被问及很多问题。

这显然是一个不同的数据结构,取决于你如何访问它。

第一个更像是一个2级树结构。再次将x坐标映射到几个y坐标。这听起来有点不适合你的问题。

第二个不允许您获取特定x坐标的所有元素(或者您可以调用它)。反正你可能不需要?

如果您需要将(x,y)坐标映射到平铺,则第二种方法可能会正常。

+0

由于'std :: map'中的键是有序的,所以您肯定可以遍历所有具有特定x坐标的元素。从第一个键开始,至少与make_pair(x,INT_MIN)一样大,然后继续后续的键,直到到达结尾或找到其x坐标不同的一个键。无论使用哪种数据结构都无法做到,可以轻松地通过具有特定y坐标的元素进行迭代。 – rici 2013-02-11 18:18:20

+0

那么这两种方式都没有明显的内存或速度问题?目前我可以通过x坐标指向的地图访问它,然后获取y坐标指示我从该地图指向的地图块。我一直在想它,因为主要的地图是一列地图,以及瓷砖的列和地图。 – rekh127 2013-02-11 19:21:42

为什么不使用向量的矢量,std :: vector < std :: vector>?

这样会更好,除非你的网格很稀疏(并非网格中的每个元素都有一个平铺),并且你想节省内存。如果速度是问题,使用矢量的访问时间会更好,因为std :: map使用tress作为基础结构。

+0

*“使用向量的访问时间会更好”* - 除非有很多元素必须定期遍历,并且您正在使用矢量向量,这会消除数据局部性。 – 2013-02-11 18:06:38

+0

你是对的,它取决于数据的访问模式和大小。 – umps 2013-02-11 18:18:37

+0

对不起,我不知道如何描述它,但我的网格很稀疏,它的目的是让它上面可能会有空白区域产生的斑点,而且这些空白区域只在必要时填充。因此,在成千上万个可能的瓷砖网格中,最初只有几十个可能存在,但我需要维持位置的x,y。 – rekh127 2013-02-11 19:25:39