Как динамически добавлять объекты - PullRequest
1 голос
/ 22 декабря 2009

Это вопрос:

Как это сделать правильно?
IT = добавлять объекты динамически (значит создавать структуры классов для поддержки этого)

class Branch   
{  
    Leaves lv;         //it should have many leaves!!  
}  

class Tree   
{  
    Branch br;         //it should have many branchs!!!   
}

Теперь нерабочий пример (ни один из них не с ++, но я пытаюсь нарисовать идею)

class Branch  
{  
   static lv_count;  

   Leaves lv; //it should have many leaves!!   (and should be some pointer)

   public:  
   add(Leave lv)  
   {  
       lv[lv_count] = lv;  
       lv_count ++ ;  
   }  
}  

class Tree  
{  
   static br_count;

   Branch br; //it should have many branchs!!! (and should be some pointer)

   Tree
   public:
   add(Branch br)
   {
       br[br_count] = lv;
       br_count ++ ;
   }

}

это, например, достижение глупого подхода:

class Branch
{
   static count;
   Leaves l[1000]; //mmm i don't like this
   //...
}

class Tree
{
   static count;
   Branch b[1000]; //mmm i don't like this
   //...
}

Я хотел бы знать формальный нормальный способ сделать это, спасибо !!!!!!

Ответы [ 2 ]

3 голосов
/ 22 декабря 2009

std :: vector - это то, что вы ищете, я думаю ...

class Tree
{
   std::vector<Branch> branches;
};
1 голос
/ 22 декабря 2009

Векторы являются общим решением. Однако вы должны посмотреть на распределение памяти, прежде чем начать использовать код библиотек, таких как векторы - например, C ++ new, calloc, malloc, локальная память потоков и т. Д. Каждый контейнер STL имеет свои собственные алгоритмические сложности, и их изучение поможет вам в выборе правильный

Обсуждение:

Если вы хотите, чтобы что-то росло, и у вас нет места для этого ... ну, вы должны выполнить realloc () или поставить алгоритмически. Получите больший буфер памяти и скопируйте старый буфер в него с правильными смещениями индекса . Это то, что делает вектор за сценой; Конечно, вектор просто делает это очень хорошо (это зависит от реализации), растя с помощью линейной функции (2x). растущий таким образом означает, что у него больше памяти, чем нужно, что означает, что данные, добавленные в вектор в будущем, не вызовут немедленного перераспределения.

Однако я должен добавить, что это очень неэффективно, вы почти всегда можете избежать затрат на копирование. Основное использование вектора - для смежных областей памяти, вы почти всегда можете улучшить вектор, используя связанные структуры данных, возможно, в двоичном дереве для поиска по ключу: D

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