【问题标题】:What are the advantages of a map of maps vs a std::pair as a key映射映射与 std::pair 作为键的优势是什么
【发布时间】:2013-02-11 17:33:31
【问题描述】:

以下制作旨在表示二维网格的地图的方法有哪些优点和缺点。网格应该能够在任何时候被填充,而无需为整个事物分配内存,这就是我不只使用二维数组的原因。

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

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

或者,如果您有其他更好的想法,请告诉我。如果这个问题经常被问到,我很抱歉。

【问题讨论】:

    标签: c++ data-structures map


    【解决方案1】:

    它(显然)是一种不同的数据结构,取决于您如何访问它。

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

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

    如果您需要将 (x,y) 坐标映射到图块,则第二种方法可能没问题。

    【讨论】:

    • 由于std::map 中的键是有序的,您当然可以遍历具有特定x 坐标的所有元素。从至少与 make_pair(x, INT_MIN) 一样大的第一个键开始,然后继续使用后续键,直到到达末尾或找到 x 坐标不同的键。使用任何一种数据结构都无法轻松遍历具有特定 y 坐标的元素。
    • 所以无论哪种方式都没有显着的内存或速度问题?目前,我在获取 x 坐标指向我的地图时访问它,然后从该地图获取 y 坐标指向我的图块。我一直认为它的主地图是列的地图,以及瓦片的列和地图。
    【解决方案2】:

    为什么不使用向量的向量 std::vector ?

    除非你的网格是稀疏的(不是网格中的每个元素都有一个 Tile),并且你想节省内存,否则会更好。如果速度是问题,使用向量的访问时间会好得多,因为 std::map 使用 tres 作为底层结构。

    【讨论】:

    • “使用向量的访问时间会更好” - 除非有很多元素需要定期遍历并且您使用的是向量向量,否则杀死你的数据局部性。
    • 你是对的,这取决于数据的访问模式和大小。
    • 对不起,我不知道如何描述它,但我的网格是稀疏的,它的目的是为了在其上产生一些中间有空白区域的点,而那些空白区域的仅在必要时填写。因此,在数千个可能的 Tiles 网格中,最初可能只有几十个,但我需要保持 x,y 的位置。
    猜你喜欢
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 2013-05-11
    • 2010-12-22
    • 1970-01-01
    相关资源
    最近更新 更多