std :: vector维度,“俄罗斯方块”形状允许?

时间:2011-12-04 02:08:34

标签: c++

嗨我有一个关于在c ++中使用向量的问题,我正在研究通过随机运动模拟通过容器的粒子运动的问题。我需要添加和删除粒子,因为它们符合或不符合某些标准,为此我发现矢量类非常方便,但我是c ++的新手,并且我需要考虑效率问题。

我定义的2D数组是限制为矩形还是正方形?我只需要在每个容器中存储粒子的位置。我担心的是我的矩阵看起来像这样:

| | | | |

| | | | |

| | | | |

| | | | |

对于4x4案例。随着列的输入是每个箱/容器中粒子的位置以及不同箱子的粒子数量,我想知道这样的事情是否可能:

| | | | |第一个箱子里有4个颗粒

| | |第二个bin中有2个粒子,占用的内存比上一个小2倍

| | | | | | | | | | | | | | | | |这很多在第三个箱子里等等。

我还需要删除行中的元素(减少行大小)或添加行中的元素(增加行大小)或列中,这取决于我实现算法的方式,如果您事先可以提醒我,我会很感激在处理多维度的向量时会出现常见错误,因为我肯定会创建一个,对编程语言不熟悉:)

2 个答案:

答案 0 :(得分:3)

您可以使用矢量矢量:vector<vector<Particle> >

答案 1 :(得分:0)

首先,当您询问“2D数组......限于...矩形或正方形”时,听起来就像是在询问如何表示“锯齿状”数组(不是矩形但有固定的数组)高度“,每行有一个”宽度“变量。

但是"tetris" shapestetraminos)并不特别适合于锯齿状阵列。这让我觉得你真的想要a sparse array。也就是说,您只想存储粒子的位置,而不是存储非粒子的位置。

最简单的方法是跳过网格,直接维护占用空间/粒子的位置列表。

struct Position
{
    float X;
    float Y;
};

// ...

std::vector<Position> particles; // std::list works too...

但是普通列表在某些方面效率不高。如果您需要对这些进行空间索引访问,例如,为了找出模拟中给定体积/区域中有多少粒子,那么您应该使用仍然允许稀疏填充的a space partitioning data structure

人们通常以您描述的方式执行此操作,使用矩形网格,然后将列表存储在该网格单元格中包含的粒子的每个网格位置。但是对于未使用的网格单元来说“浪费空间”。它无法解决稀疏人口问题。

支持空间索引和稀疏填充的流行数据结构是a quadtree