嗨我有一个关于在c ++中使用向量的问题,我正在研究通过随机运动模拟通过容器的粒子运动的问题。我需要添加和删除粒子,因为它们符合或不符合某些标准,为此我发现矢量类非常方便,但我是c ++的新手,并且我需要考虑效率问题。
我定义的2D数组是限制为矩形还是正方形?我只需要在每个容器中存储粒子的位置。我担心的是我的矩阵看起来像这样:
| | | | |
| | | | |
| | | | |
| | | | |
对于4x4案例。随着列的输入是每个箱/容器中粒子的位置以及不同箱子的粒子数量,我想知道这样的事情是否可能:
| | | | |第一个箱子里有4个颗粒
| | |第二个bin中有2个粒子,占用的内存比上一个小2倍
| | | | | | | | | | | | | | | | |这很多在第三个箱子里等等。
我还需要删除行中的元素(减少行大小)或添加行中的元素(增加行大小)或列中,这取决于我实现算法的方式,如果您事先可以提醒我,我会很感激在处理多维度的向量时会出现常见错误,因为我肯定会创建一个,对编程语言不熟悉:)
答案 0 :(得分:3)
您可以使用矢量矢量:vector<vector<Particle> >
答案 1 :(得分:0)
首先,当您询问“2D数组......限于...矩形或正方形”时,听起来就像是在询问如何表示“锯齿状”数组(不是矩形但有固定的数组)高度“,每行有一个”宽度“变量。
但是"tetris" shapes
(tetraminos)并不特别适合于锯齿状阵列。这让我觉得你真的想要a sparse array。也就是说,您只想存储粒子的位置,而不是存储非粒子的位置。
最简单的方法是跳过网格,直接维护占用空间/粒子的位置列表。
struct Position
{
float X;
float Y;
};
// ...
std::vector<Position> particles; // std::list works too...
但是普通列表在某些方面效率不高。如果您需要对这些进行空间索引访问,例如,为了找出模拟中给定体积/区域中有多少粒子,那么您应该使用仍然允许稀疏填充的a space partitioning data structure。
人们通常以您描述的方式执行此操作,使用矩形网格,然后将列表存储在该网格单元格中包含的粒子的每个网格位置。但是对于未使用的网格单元来说“浪费空间”。它无法解决稀疏人口问题。
支持空间索引和稀疏填充的流行数据结构是a quadtree。