如何创建一个节省内存的网格类? 大多数时候,你在C++中制作对象网格的方式是这样的: class Grid { private: GridObject[5][5]; };

如何创建一个节省内存的网格类? 大多数时候,你在C++中制作对象网格的方式是这样的: class Grid { private: GridObject[5][5]; };,c++,arrays,memory,C++,Arrays,Memory,但是,有没有一种方法可以节省内存而不使用没有任何内容的磁贴呢?假设你有一个棋盘。如果您不想在未占用的空间中使用内存,该怎么办?我正在考虑这样做的方法,但它们效率低下。我的结构如下: class GridObjectWithIndex { public: size_t index; GridObject obj; }; 其中,index是x+y*GRIDSIZE形式的值,因此您可以轻松地解码其中的x和y 在你的表格中课程中: class Grid { std::vecto

但是,有没有一种方法可以节省内存而不使用没有任何内容的磁贴呢?假设你有一个棋盘。如果您不想在未占用的空间中使用内存,该怎么办?我正在考虑这样做的方法,但它们效率低下。

我的结构如下:

class GridObjectWithIndex
{
public:
    size_t index;
    GridObject obj;
};
其中,index是
x+y*GRIDSIZE
形式的值,因此您可以轻松地解码其中的
x
y

在你的
表格中
课程中:

class Grid
{
    std::vector<GridObjectWithIndex> grid_elements;
};
类网格
{
std::矢量网格元素;
};

我想到的第一件事是在网格中存储指针GridObject*。对于不存在的元素,它仍然会消耗sizeof(GridObject*)字节,但它使您免于管理数据结构的噩梦。如果它不是绝对关键的,不要让它变得比需要的更复杂。这绝对不值得下棋(8x8)

fritzone的解决方案将是好的,如果你有一个广泛的指数范围内的少量元素。但是,请考虑读/写性能


<>如果你想在网络发送或保存文件时节省空间,你可能需要考虑归档算法。尽管它只适用于大型数据集。

您所要求的是稀疏数据结构,最显著的例子是稀疏矩阵

其想法是用内存换取CPU:以更多操作为代价使用更少的内存。一般而言,它意味着:

  • 具有仅表示“异常”值的结构(通过坐标快速访问)
  • 把“通常”的价值放在一边

作为概念证明,您可以使用
std::map
作为稀疏结构,只要在
map

中不存在另一个
对象时,在旁边放置另一个
对象
,或许我也可以按索引排序,以加快速度。这正是我所想的,但我不知道它是否会很快。最好的方法实际上取决于网格中数据的特性(许多相邻单元格具有相同的值,只有少数唯一的值,但网格中的随机模式,网格中的特定模式,…)。你能提供更多的信息吗?还有,GridObject的大小是多少?