C ++ структура, похожая на вектор, но которая автоматически изменяет размер - PullRequest
0 голосов
/ 12 марта 2020

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

Моя проблема теперь в том, что с моим текущим моделированием я не знаю, как далеко должны расти мои клетки вдоль коридора, то есть я не знаю, какую «длину» мне нужно для моей 2d сетки. (Потому что это будет стохастически меняться от запуска к запуску) Чтобы «вырастить» мои ячейки, т.е. разместить новые объекты на моей сетке, мне нужно получить доступ к указанным c точкам сетки, но если я не знаю макс. Требуется длина, но я не могу инициировать вектор с достаточной длиной в начале.

Есть ли какая-то структура, где я могу получить доступ к каждому слоту через индекс, как в векторе, но где я не делаю нужно с самого начала изложить насколько он велик? (Я знаю, что с вектором мне не нужно указывать длину с самого начала, но я не всегда использую append, потому что иногда в сетке есть пробелы, поэтому мне нужно иметь доступ к указанным c независимым от начало).

Извините, если я сформулировал вопрос недостаточно ясно, пожалуйста, дайте мне знать, если у вас есть идея или вопрос неясен. Спасибо!

Ответы [ 2 ]

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

Вы могли бы написать что-то вроде:

#include <vector>
#include <iostream>

struct foo { 
    std::vector<int> data;
    int& operator[](size_t i){
        if ( data.size() < i) data.resize(i-1);
        return data[i];
    }
};

int main() {
    foo f;
    f[100] = 10;
    std::cout << f[100];
}

Однако я бы не советовал использовать это на самом деле. std::vector дает вам точный контроль над тем, когда и где происходит распределение. Вы можете использовать resize и / или reserve, чтобы убедиться, что в векторе достаточно элементов / емкости. С другой стороны, вышеизложенное приведет к изменению размера вектора в тех местах, где его не ожидают. push_back - это добавление элементов, при доступе к элементу через [] или at должен быть доступ к элементу или сбой.

Вместо этого вы можете зарезервировать достаточно места, а затем push_back столько элементов, сколько у вас будет:

 std::vector<int> foo;
 // dont know how many elements exactly, but it will be less than 1000
 foo.reserve(1000);
 while (some_condition()) foo.push_back(something());
0 голосов
/ 12 марта 2020

Есть ли какая-то структура, где я могу получить доступ к каждому слоту через индекс, как в векторе, но где мне не нужно с самого начала указывать, насколько он велик?

Да. std::vector похоже на эту структуру. Вы можете позвонить push_back, чтобы увеличить размер на единицу, или позвонить resize, чтобы увеличить размер на произвольную величину. Не нужно знать размер при инициализации.

, но я не всегда использую append

Затем используйте resize.

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