指针网格保持空间结构随对象数量的变化 C++

Posted

技术标签:

【中文标题】指针网格保持空间结构随对象数量的变化 C++【英文标题】:Grid of pointers to keep spatial structure over changing amount of objects C++ 【发布时间】:2020-03-21 21:46:12 【问题描述】:

TL:DR 我想通过指向对象的 2d 指针向量来跟踪某些对象的空间结构。对象本身位于一维向量中。有人告诉我这不是做事的方法,我正在寻找更好的方法。

我想用 C++ 编写一个关于空间细胞生长的模拟。单元格应该放置在某种二维网格上,因为我需要它们之间的空间结构来实现增长算法。模拟从设定宽度的“走廊”中的一行单元格开始,但长度未知。为了实现不断将与某个旧单元相邻的新单元重复放置到网格上的生长算法,我需要单元之间的空间结构(因此使用 2d 网格)。这个增长过程会持续很长时间,直到满足某些条件。有时它会很快结束,但有时我走廊所需的“长度”会超过我电脑的内存容量。幸运的是,我只需要记住走廊后面的某些牢房。一些细胞的祖先线与细胞群的生长前沿失去联系可能会被“遗忘”。此外,我只需要这个 2d 空间结构用于一些“沿着”我的细胞群前部“徘徊”的小网格,因为在后面更远的地方所有东西都已经被填充了,因此那里的空间结构不再重要了。

因此,我想要一些数据结构来跟踪我的“重要”单元格,这些单元格不必在空间上结构化,然后是一些额外的小网格结构,它沿着我的殖民地的前面游荡并且可以指向到当前位于我不断增长的界面前面的单元格。

我最初的想法是有一个指向一个大向量的二维指针网格。向量将跟踪所有重要的单元格,即在每个新的单元格对象中都将添加到向量中,一旦它变得不重要,我会将其从向量中删除。同时,指向向量元素的指针网格将跟踪我在前面的空间结构,一旦我的单元格从我的指针网格中长出来,指针就会更新,即我会移动我的网格与前面一起。

在另一个问题 (Strange output from dereferencing pointers into a vector) 中有人告诉我,有指向向量的指针是不好的。我不知道我还能怎么做。也许有人对如何处理这个有想法。谢谢!

【问题讨论】:

为什么不能在向量中存储索引而不是指针?调整主向量大小时指针会失效,而索引不会。 @MinorThreat 但是如果我从向量中删除元素,索引也会发生变化,对吧?我需要从向量中删除元素,否则它会再次变得太大。 您是否尝试过使用按复合键 [x, y] 排序的单个数组的更简单方法?如果您必须不断地按 y 查找相邻单元格,您可以创建另一个数组 [y, x] index_in_first _array 按 [y, x] 排序。 【参考方案1】:

根据我从您的问题中了解到的情况,并且我确信我没有完全理解它,我认为您想要的是模拟某种在二维网格中生长的细胞。

假设您的单元格是某种对象,请将您的 单元格 直接存储到二维数组中,并有一个存储重要单元格索引的列表。

作为一个实现,让:-

class Cell
    ...    //data members

    bool enabled;    //Just for representing empty/available spaces in 2-D grid. If it is set to true, then there is a cell in the specific unit of the grid.
    Cell()
        enabled = false;
    

    ...    //other cell data

成为你用来制作单个单元格对象的类;然后:-

std::vector<std::vector<Cell>> grid(m, vector<Cell>(n));

将代表您的二维网格,大小为 m*n。

现在,由于默认构造函数,grid 中的所有单元格都将具有enabled = false。这很好,因为它可以作为细胞生长的空间。

接下来,有一个存储“重要”单元格索引的列表:-

struct Index
    int x, y;
    Index(int x_, int y_)
        x = x_;
        y = y_;
    

std::list<Index> importantCells;

注意:我在这里使用列表是因为我假设您不需要随机访问。

最初, 将一些“重要”单元格放入网格中,例如在网格的 (0, 0) 处:-

grid[0][0] = Cell(...) //Assuming you have some parameterized constructor for that...

现在,将索引 0,0 存储在您的 importantCells 列表中:-

importantCells.emplace_back(0, 0);    //or use push_back() if you wish

现在,遍历importantCells 列表,读取“重要”单元格的位置并在二维grid 中更新它们。这将导致生成新的“重要”细胞,并可能移除当前的“重要”细胞(因为它可能没有更多的生长空间)。对于新生成的单元格,使用emplace_front将其添加到列表中,如果当前单元格变得不重要,则将其从列表中删除...

如果您想要随机访问,您也可以使用向量,但列表似乎更适合您的场景。

【讨论】:

以上是关于指针网格保持空间结构随对象数量的变化 C++的主要内容,如果未能解决你的问题,请参考以下文章

返回后指针不会从函数返回到它的引用(保持为空)C++

11.9 C++对象指针

11.9 C++对象指针

11.9 C++对象指针

软件开发入门教程网之C++ 引用

C++ 指针