Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> деревья с неизвестным количеством потомков. 
:(
    Опции темы
tonchitos
Дата 11.3.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: нет
Всего: 40



Идея такая, нужно дерево с неизвестным количеством классов потомков.
То есть у меня дерево, размеры которого нужно менять и количество потомков каждого потомка тоже, по желанию.

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


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
andrew_121
Дата 11.3.2008, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33





--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
korian
Дата 11.3.2008, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



например так:
Код
#include <vector>

template <class T>
class Tree : public std::vector<Tree>
{
public:
   T data;
};



Это сообщение отредактировал(а) korian - 11.3.2008, 17:32
PM   Вверх
Lazin
Дата 11.3.2008, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



korian, стандартные контейнеры не предназначены для наследования,
Каждый узел бинарного дерева может содержать произвольное количество потомков, несмотря на то, что указателя всего 2... просто у дерева рекурсивная природа, и потомки определенного узла, находятся в различных отношениях друг с другом, они упорядочены.То-есть мы можем взять любой узел и определить как он соотносится с каждым из своих потомков.  А если сделать список, то это уже сложно будет внятно использовать... смысла такая структура не имеет  smile


Это сообщение отредактировал(а) Lazin - 12.3.2008, 08:44
PM MAIL Skype GTalk   Вверх
maxim1000
Дата 11.3.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



а я бы всё-таки делал контейнер (список, вектор или ещё что-либо, в зависимости от параметров задачи) потомков в каждом узле
с помощью бинарного дерева, конечно, можно реализовать любое другое, только это не означает, что нужно

P.S.
начать стоит с того, чтобы подумать, как было бы удобно работать с этим деревом, например, написать несколько фрагментов кода, как будто дерево уже реализовано, оттуда и плясать

Это сообщение отредактировал(а) maxim1000 - 11.3.2008, 18:14


--------------------
qqq
PM WWW   Вверх
korian
Дата 11.3.2008, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(Lazin @  11.3.2008,  16:44 Найти цитируемый пост)
стандартные контейнеры не предназначены для наследования

это где такое написано?
Цитата(Lazin @  11.3.2008,  16:44 Найти цитируемый пост)
А если сделать список

то что я предложил, является деревом с произвольным количеством child'ов и любой глубины.

короче, что-то я, наверно, не понял задачу и до сих пор не понимаю.


Это сообщение отредактировал(а) korian - 11.3.2008, 19:08
PM   Вверх
SABROG
Дата 11.3.2008, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Я обычно делаю так. Действительно беру за основу контейнер типа vector. Создаю свою структуру добавляю членом - контейнер, объявляю другие необходимые структуры, которые также могут содержать контейнеры и через new выделяю указатели, которые и пихаю в контейнеры. Потом пробегаюсь по контейнерам и вызываю delete на указатели структур. Поэтому удобно вынести это в класс, удаление добавить в деструктор. А в конструкторе можно формировать само дерево.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
korian
Дата 11.3.2008, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



объясните, пожайлуста, кто-нибудь чем вас не устраивает, то что я написал.

Tree t; - корень дерева
t.push_back(Tree()); - добавляем дочерний узел
t.begin()...t.end() - дочернии узлы узла t;
t.data - данные, соответствующие узлу t;
(*(*t.begin()).begin()) - дочерний узел дочернего узла узла t;
и не надо самому заморачиваться с выделением/удалением памяти.

что еще надо?

Это сообщение отредактировал(а) korian - 11.3.2008, 22:05
PM   Вверх
maxim1000
Дата 11.3.2008, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



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

Добавлено через 7 минут и 44 секунды
касательно наследования от вектора:
у него нет виртуального деструктора
это значит, что возможна такая ситуация:
A наследуется от std::vector
где-то создаётся объект класса A
потом куда-то передаётся по указателю на std::vector
потом к нему кто-то применяет delete
из-за отсутствия виртуального деструктора у вектора, деструктор A и его полей не будет вызван, что может вызвать проблемы

тут, конечно, никто не предполагает, что объекты будут уничтожаться через указатель на вектор, но в большинстве более-менее долго разрабатываемых программ появится ситуация, когда это покажется удобным

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



--------------------
qqq
PM WWW   Вверх
korian
Дата 11.3.2008, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(maxim1000 @  11.3.2008,  22:26 Найти цитируемый пост)
операция push_back время от времени будет приводить к перевыделению памяти и копированию всех элементов

решаеться заменой vector на list

Цитата(maxim1000 @  11.3.2008,  22:26 Найти цитируемый пост)
у него нет виртуального деструктора

ну это просто необходимо помнить
или проще класс Tree обернуть в что-то подобное умного указателя, и не давать создавать/уничтажать объект пользователям, чтобы не возникали проблемы с этим.


Это сообщение отредактировал(а) korian - 11.3.2008, 23:55
PM   Вверх
tonchitos
Дата 12.3.2008, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: нет
Всего: 40



Если честно, я с контейнерами не знакома.
Вот щас почитаю, конечно. Если можно, разьясните мне преимущества контейнера в данном случае.
korian, вы все верно поняли, мне дейсвительно это и нужно:

Цитата(korian @  11.3.2008,  19:01 Найти цитируемый пост)
является деревом с произвольным количеством child'ов и любой глубины.


Если вам не очень трудно, дайте мне побольше пояснений как это будет работать, я с контейнерами не работала.
Простите за беспокойство  smile 


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
korian
Дата 12.3.2008, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



там ошибка была и заменим vector на list
Код

#include <list>

template <class T>
class Tree : public std::list<Tree<T> >
{
public:
   T data;
};


Цитата(tonchitos @  12.3.2008,  00:06 Найти цитируемый пост)
преимущества контейнера в данном случае

только в том, что класс дерево создается 5-ю строчками.

Цитата(tonchitos @  12.3.2008,  00:06 Найти цитируемый пост)
Если вам не очень трудно, дайте мне побольше пояснений как это будет работать, я с контейнерами не работала

переписывать хелп по контейнерам нету желания
поищите, думаю на форуме много примеров использования <list>
основное, как использовать это дерево я писал выше.
по конкретным функциям могу ответить...

Это сообщение отредактировал(а) korian - 12.3.2008, 04:02
PM   Вверх
Lazin
Дата 12.3.2008, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



стандартные контейнеры не предназначены для наследования еще и по тому что у них нет protected членов, то-есть наследуя от вектора или списка мы по сравнению с композицией ничего не выигрываем, а только добавляем зависимость, так-как теперь код работающий с Tree зависит от интерфейса контейнера, что не есть гуд... вообще наследованием увлекаться не стоит
подробно это описано у Мейерса...
хранить в контейнере лучше все-таки указатели, желательно умные)), так-как элементы контейнера не обязательно будут простыми структурами, возможно узлом дерева будет что-то имеющее таблицу виртуальных функций))

теперь о деревьях...

      5
    /   \
  2     7
  /\    /\
 1 4 6  9

вот упорядоченное бинарное дерево.. теперь вопрос, а как может быть упорядочено дерево с более чем 2-мя потомками.. объясните мне))

единственное применение, на мой взгляд, это всякие иерархические структуры данных, элементы которых находятся в отношениях родитель - потомок, например GUI библиотеки... там элемент управления(кнопка например) может принадлежать другому элементу управления и при удалении родителя должен быть удален и потомок. Или например DOM представление XML документа...
PM MAIL Skype GTalk   Вверх
Mayk
Дата 12.3.2008, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(korian @  12.3.2008,  03:52 Найти цитируемый пост)

ну это просто необходимо помнить
или проще класс Tree обернуть в что-то подобное умного указателя, и не давать создавать/уничтажать объект пользователям, чтобы не возникали проблемы с этим.

Зачем героически преодолевать собственные грабли, если их можно банально не разбрасывать?




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
korian
Дата 12.3.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(Lazin @  12.3.2008,  08:08 Найти цитируемый пост)
а как может быть упорядочено дерево с более чем 2-мя потомками.. объясните мне))

Код

#include <list>

template <class T>
class Tree : public std::list<Tree<T> >
{
public:
   operator < (const Tree<T> & node) {return data < node.data};
   void sort()
   {
       std::list<Tree<T> >::sort();
       for (Tree::iterator i = begin(); i != end(); i++)
          i->sort();
   }
   T data;
};

void main()
{
    Tree<int> root;
    ....
    root.sort();
}


Цитата(Mayk @  12.3.2008,  08:39 Найти цитируемый пост)
Зачем героически преодолевать собственные грабли, если их можно банально не разбрасывать?

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


Это сообщение отредактировал(а) korian - 12.3.2008, 16:28
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0700 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.