Сетка указателей для сохранения пространственной структуры в зависимости от количества объектов C ++ - PullRequest
1 голос
/ 22 марта 2020

TL: DR Я хочу отслеживать пространственную структуру некоторых объектов с помощью 2-го вектора указателей, указывающих на объекты. Сами объекты находятся в одномерном векторе. Мне сказали, что это не способ делать вещи, и я ищу лучший подход.

Я хочу написать симуляцию пространственного роста клеток в C ++. Ячейки должны быть помещены в какую-то 2-мерную сетку, потому что мне нужна пространственная структура между ними для реализации алгоритма роста. Моделирование начинается с линии ячеек в «коридоре» заданной ширины, но еще не известной длины. Для реализации растущего алгоритма, который многократно помещает новые ячейки рядом с некоторой старой ячейкой в ​​сетку, мне нужна пространственная структура между ячейками (следовательно, использование двумерной сетки). Этот процесс роста будет продолжаться очень долго, пока не будет выполнено какое-либо условие. Иногда это заканчивается быстро, но иногда необходимая «длина» моего коридора превышает объем памяти моего компьютера. К счастью, мне нужно помнить только некоторые клетки в задней части моего коридора. Некоторые клетки, чья родословная линия теряет связь с растущим фронтом клеточной колонии, могут быть «забыты». Кроме того, эта двумерная пространственная структура нужна мне только для какой-то маленькой сетки, «блуждающей» по фронту колонии моих клеток, поскольку дальше сзади все уже будет заполнено, и, следовательно, пространственная структура там уже не важна.

Поэтому я хочу иметь некоторую структуру данных, которая отслеживает мои «важные» ячейки, которые не должны быть пространственно структурированы, а затем некоторую дополнительную небольшую сеточную структуру, которая блуждает вдоль передней части моей колонии и может указывать на ячейки в настоящее время на передней части моего растущего интерфейса.

Моя первоначальная идея состояла в том, чтобы иметь двумерную сетку указателей, которые указывают на большой вектор. Вектор будет отслеживать все важные ячейки, т. Е. В каждом новом объекте ячейки будет добавлен вектор, и как только он станет неважным, я удалю его из вектора. В то же время сетка указателей, которые указывают на элементы вектора, будет отслеживать мою пространственную структуру спереди, и указатели будут обновляться, как только мои ячейки вырастут из сетки указателей, то есть тогда я переместлю свою grid вместе с front.

Мне сказали в другом вопросе ( Странный вывод из разыменования указателей на вектор ) У меня было, что нехорошо иметь указатели на вектор. Я не понимаю, как еще я мог бы сделать это все же. Может быть, у кого-то есть идея, как с этим справиться. Спасибо!

1 Ответ

1 голос
/ 22 марта 2020

Насколько я понимаю из вашего вопроса, и я уверен, что не понимаю его полностью, я думаю, что вы хотите, чтобы имитировать некоторые виды клеток, растущих в двумерной сетке.

Предполагая, Ваша ячейка - это некий объект. Сохраните ваши ячейки непосредственно в двумерном массиве и получите список, в котором хранятся индексы важных ячеек.

В качестве реализации, давайте: -

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, прочитайте позиции «важных» ячеек и обновите их в своем 2-D grid. Это приведет к генерации новых «важных» ячеек и, возможно, к удалению текущей «важной» ячейки (потому что у нее может не хватить места для роста). Для вновь сгенерированных ячеек добавьте их в список, используя emplace_front, и, если текущая ячейка становится неважной, удалите ее из списка ...

Вы также можете использовать вектор, если вам нужен произвольный доступ, но списки кажутся лучше для вашего сценария.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...