Дякую за зауваження пане! А чому?
- тому що це совго рода рекурсія, давайте по простому беремо інстанс що у ньому вектор, а у векторі що інші інстанси з вектором того самого...Вам не здається, що ви замість дерева пишите модель всесвіту чи фрактал, де йде ділення до бескінечності?Я вже не кажу про навігацію по цьому страхіттю.
По друге ви використовуєте вектор,
А з вектором значить не можна? А якщо в мене дерево не бінарне, а я не знаю наперед скільки арне?
який при ресайзі вимагає видалаення попередніх інстнсів, перезамовлення пам'яті а потім визову операторів копіювання(це якщо ви не хочете втратити попередні данні, тобто ви ще resize перепишете самі бо кожного раза видаляти та копіювати наприклад якийс дамп розміром кілька сотень мегабайтів м'яко кажучи безглуздо), ви напевне думаєте що меморі сама собою там плюсується - розачарую вас. Розберіть цей код, подивитесь скільки разів у векторі все перестворюється та видаляється http://codepad.org/H1hpVfhR
▼Прихований текст
#include <vector>
#include <iostream>
using namespace std;
class cItem{
public:
char *str;
cItem(const char * str = 0) {
if( str )
strcpy(cItem::str = new char[1 + strlen(str)], str);
else
cItem::str = 0;
cout<<"DFLT CONSTRUCT : "<<(cItem::str ? cItem::str : "null")<<endl;
}
cItem(const cItem &pCopy)
{
char * str = const_cast< char *>(pCopy.str);
if( str )
strcpy(cItem::str = new char[1 + strlen(str)], str);
else
cItem::str = 0;
cout<<"COPY CONSTRUCT : "<<(cItem::str ? cItem::str : "null")<<endl;
}
~cItem(){
cout<<"DESTRUCT : "<<(cItem::str ? cItem::str : "null")<<endl;
delete str;
}
};
int main(){
cItem itemArr[] = {
cItem("test1"),
cItem("test2"),
cItem("test3")};
vector< cItem > itemVec(itemArr, itemArr + 3);
cout<<"INITIAL"<<endl;
cout<<itemVec[0].str<<endl;
cout<<itemVec[1].str<<endl;
cout<<itemVec[2].str<<endl;
cout<<"RESIZE"<<endl;
itemVec.resize(5);
cout<<itemVec[0].str<<endl;
cout<<itemVec[1].str<<endl;
cout<<itemVec[2].str<<endl;
cout<<"EOP"<<endl;
cin.get();
return 0;
}
Output
DFLT CONSTRUCT : test1
COPY CONSTRUCT : test1
DESTRUCT : test1
DFLT CONSTRUCT : test2
COPY CONSTRUCT : test2
DESTRUCT : test2
DFLT CONSTRUCT : test3
COPY CONSTRUCT : test3
DESTRUCT : test3
COPY CONSTRUCT : test1
COPY CONSTRUCT : test2
COPY CONSTRUCT : test3
INITIAL
test1
test2
test3
RESIZE
DFLT CONSTRUCT : null
COPY CONSTRUCT : null
COPY CONSTRUCT : null
COPY CONSTRUCT : test1
COPY CONSTRUCT : test2
COPY CONSTRUCT : test3
COPY CONSTRUCT : null
COPY CONSTRUCT : null
DESTRUCT : test1
DESTRUCT : test2
DESTRUCT : test3
DESTRUCT : null
DESTRUCT : null
DESTRUCT : null
test1
test2
test3
EOP
DESTRUCT : test1
DESTRUCT : test2
DESTRUCT : test3
DESTRUCT : null
DESTRUCT : null
DESTRUCT : test3
DESTRUCT : test2
DESTRUCT : test1
У вас дизайн поганий тим що він рекурсивний, а не древовидний.
Якщо ви вирішили сторити дерево то застосовйте або двосполученний список( який не потребує видалення та копіювання попередньо накопленого) а краще використовуйте трисполученний список. Я показую двосполученний(там взагалі то список списків який імітє дерево), але якщо T зробити за поінтером то зможете у T хранити інші такі самі дерева. http://codepad.org/zMRCw2ga
▼Прихований текст
#include<list>
#include<iostream>
using namespace std;
class cBase{
public:
virtual ~cBase(){}//робимо клас поліорфним
};
class cChild : public cBase{
public:
//тут що завгодно
virtual void metod1(){};
};
template<class T>
class cListItem
{
public:
T data;//під дата розумію якогось далекого cChild з купою методів та полів
cListItem<T> * prev;
cListItem<T> * next;
cListItem(){
//прошу, робіть це відразу!
prev = 0;
next = 0;
}
};
template<class T>
class cTList : public list<T>{
public:
//push, pop, set переопреділяємо як хочемо
};
template <class T>
class cItemList : public cTList < cListItem<T> >
{
public:
};
template<class T1, class T2>
class cTreeItem : public cListItem<T2>{
public:
T1 tkey;//сюди ложіть ключа
//T2 data;//сюди ложіть cItemList T2 = cItemList <якийсь інстанс>
};
template<class T1, class T2>
class cItemTree : public list<cTreeItem<T1, T2> >
{
public:
};
int main(){
return 0;
}
PS:У любому випадку можете мене не слухате("наб'єте шишок", тоді повернитсь до цього посту перечитаєте, думаю зрозумієте, бо я сам не люблю коли нав'язують, як і що робити...)
Post's attachmentsUntitled.png 20.8 kb, 279 downloads since 2016-01-16