Проблема, над которой я работаю, связана с большой древовидной структурой. Первоначально я создавал дерево, new
добавляя новые узлы и прикрепляя их к родительскому узлу и так далее. Это заняло ужасно много времени. Друг предложил вместо этого отказаться от динамического выделения памяти и структурировать дерево как массив со смещениями для дочерних слов. Я не делал этого раньше, поэтому у меня есть несколько вопросов о том, что на самом деле происходит.
Вот ультра базовый, никаких проверок безопасности ни на одном примере:
struct DataStructure
{
std::vector<Entry> mCollection;
};
struct Entry
{
char mValue;
std::vector<unsigned int> mOffsetCollection; //a vector of indexes that are offsets to other entries.
};
Мне любопытно, что произойдет, когда я добавлю больше данных в эту структуру. Если бы я добавил
DataStructure d;
Entry entry;
entry.mValue = 'a';
d.push_back(entry);
.
.
.//add some more entries...
.
.
//now suppose I add a bunch of offsets to these various entries in my array.
Entry& firstEntry = d.at(0);
firstEntry.mOffsetCollection.push_back(4);
firstEntry.mOffsetCollection.push_back(9);
firstEntry.mOffsetCollection.push_back(32);
..
Так что размер этой первой записи увеличивается. Что именно происходит? Я просто пробежался по маленькому примеру, и он, кажется, работал нормально. Другие записи в структуре данных не были затронуты. Сначала я был обеспокоен тем, что, возможно, если размер структуры станет большим, это приведет к следующему элементу в массиве, но я предполагаю, что этого не происходит. Это заставляет меня понять, что я действительно не знаю, что происходит за кулисами. vector<Entry>
в DataStructure d
необходимо перераспределить память?