大多数情况下,在C ++中创建对象网格的方式如下:
class Grid {
private:
GridObject[5][5];
};
但有没有办法节省内存而不使用其中没有任何内容的磁贴?说你有一个国际象棋棋盘。如果您不想在未占用的空间中使用内存怎么办?我正在考虑如何做到这一点,但效率低下。
答案 0 :(得分:2)
我的结构如下:
class GridObjectWithIndex
{
public:
size_t index;
GridObject obj;
};
其中index是x + y * GRIDSIZE
形式的值,以便您可以轻松解码x
和y
。
在Grid
班级中有:
class Grid
{
std::vector<GridObjectWithIndex> grid_elements;
};
答案 1 :(得分:0)
我想到的第一件事就是在网格中存储指针GridObject *。对于不存在的元素,它仍将消耗sizeof(GridObject *)字节,但它可以使您免于管理数据结构的噩梦。如果它不是绝对关键 - 不要让它比需要的更复杂。国际象棋绝对不值得(8x8)。
如果您在各种指数中拥有少量元素,那么fritzone的解决方案将会很好。但请考虑读/写性能。如果您想在通过网络发送或保存文件时节省空间,可能需要考虑归档算法。 Althogh只对大数据集有意义。
答案 2 :(得分:0)
您要求的是稀疏数据结构,最引人注目的例子是稀疏矩阵。
我们的想法是为CPU交换内存:以更多操作为代价使用更少的内存。一般来说,这意味着:
作为概念验证,您可以使用std::map< std::pair<size_t, size_t>, Object >
作为稀疏结构,只要Object
中没有map
,就可以使用另一个{{1}}