Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在具有不同访问方法的多个容器中存储指针是否不可取?_C++_Data Structures - Fatal编程技术网

C++ 在具有不同访问方法的多个容器中存储指针是否不可取?

C++ 在具有不同访问方法的多个容器中存储指针是否不可取?,c++,data-structures,C++,Data Structures,我目前正在制作一个节点图来存储我正在制作的2D游戏的瓷砖/对象数据。本质上,它是一张六边形瓷砖的地图,每个瓷砖上都有对象 我当前的设置基本上如下所示: class HexCell { public: HexCell* GetNeighbor(int dir) { return neighbors[dir]; }; private: HexCell* neighbors[6]; // (x, y) position // Contents of cell }; c

我目前正在制作一个节点图来存储我正在制作的2D游戏的瓷砖/对象数据。本质上,它是一张六边形瓷砖的地图,每个瓷砖上都有对象

我当前的设置基本上如下所示:

class HexCell {
public:
    HexCell* GetNeighbor(int dir) { return neighbors[dir]; };
private:
    HexCell* neighbors[6];
    // (x, y) position
    // Contents of cell
};

class HexGraph {
public:
    HexCell* GetCellByIndex(int index) { return cells[index]; };
    vector<HexCell*> GetCellsByGridIndex(int x, int y) { return grid[x][y]; };
private:
    vector<HexCell*> cells;
    vector< vector< vector <HexCell*> > > grid;
};
class-HexCell{
公众:
HexCell*GetNeighbor(int-dir){返回邻居[dir];};
私人:
HexCell*邻居[6];
//(x,y)位置
//细胞内容物
};
类六角图{
公众:
HexCell*GetCellByIndex(int-index){返回单元格[index];};
向量GetCellsByGridIndex(intx,inty){返回网格[x][y];};
私人:
载体细胞;
矢量<矢量<矢量>>网格;
};
因此,目前有3种方式访问HEXCell:

  • 通过
    单元格[]
    进行随机访问(用于迭代整个列表)
  • 使用
    网格[x][y]
    查找单元格的子集(用于渲染)
  • 图节点的单元级遍历(对游戏逻辑有用)
  • 然后我的问题是:为每个对象存储8个指针(一个在
    单元格中,一个在
    网格中,最多六个作为其他单元格的邻居),这是一种严重的内存浪费吗?


    是否有更好/更常见的方法来实现这一点,或者它是一个可接受的系统,以便为不同的用途提供不同的访问方法?

    如果十六进制地图只是一个具有直列和波浪行的二维网格,我建议将地图数据存储为二维十六进制单元格数组。您将能够根据X索引确定十六进制单元格列是偶数还是奇数,以确定它是否是下移的十六进制分幅之一

    这是10x4数组中十六进制单元格及其对应的x,y索引的粗略表示,其中x%2==1是下移了十六进制单元格高度1/2的列

    0,0     2,0     4,0     6,0     8,0
        1,0     3,0     5,0     7,0     9,0
    0,1     2,1     4,1     6,1     8,1
        1,1     3,1     5,1     7,1     9,1
    0,2     2,2     4,2     6,2     8,2
        1,2     3,2     5,2     7,2     9,2
    0,3     2,3     4,3     6,3     8,3
        1,3     3,3     5,3     7,3     9,3
    

    使用这种方法,您可以编写逻辑来确定X,Y的6个相邻元素,而无需在每个十六进制单元中存储额外的信息

    在不同的数据结构中存储(处理)相同的信息以支持不同的查找策略是完全正确的,只要查找速度的提高证明了空间的损失。但在现代计算机上,需要大量的指针才能在RAM中留下明显的凹痕。当然,这并不一定意味着你的特定结构是由你的特定用例证明的我想问题会变成“什么时候它是合理的?”作为一个业余程序员,我有时没有一个参考点来说明什么是太多的空间,什么是太慢的。好吧,在我的例子中,它确实是六边形(目前),但我可能想在将来使用一个图形,它不是严格意义上的6条边到一个节点。我的问题更倾向于更小的存储空间,而不是更大的灵活性。如果所有的瓷砖都相同,那么只有3种形状可以创建连续曲面,即平行四边形(矩形、正方形、菱形)、三角形和六边形。如果您想要灵活性,我会使用指针,但是使用网格方法更简单,您可以轻松地替换磁贴,而无需初始化该磁贴及其邻居上的所有邻居指针