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

Поиск:

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


Опытный
**


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

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



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


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


Эксперт
****


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

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



тогда уж проще использовать просто list<T>, который будет сортироваться за то-же время что и твое дерево
к тому-же узел дерева у которого есть итераторы, методы insert, push_back и тд. выглядит не как узел дерева, а как список(он и есть список)
PM MAIL Skype GTalk   Вверх
tonchitos
Дата 12.3.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вот вставила в прогу кусок с листом, ошибки...

Compiling...
Tree.cpp
1>d:\toncitos\tree\tree\metreestruct.h(11) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>        d:\toncitos\tree\tree\metreestruct.h(19) : see reference to class template instantiation 'Tree_C<T>' being compiled
1>d:\toncitos\tree\tree\metreestruct.h(11) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>        d:\toncitos\tree\tree\tree.cpp(111) : see reference to class template instantiation 'Tree_C<T>' being compiled
1>        with
1>        [
1>            T=int
1>        ]
1>Generating Code...
1>Compiling...
1>TreeView.cpp
1>Generating Code...
1>Compiling...
1>AddNewChild.cpp
1>MainFrm.cpp
1>TreeDlg.cpp
1>TreeDoc.cpp
1>Generating Code...
1>Compiling...
1>MeTreeStruct.cpp
1>d:\toncitos\tree\tree\metreestruct.h(11) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>        d:\toncitos\tree\tree\metreestruct.h(19) : see reference to class template instantiation 'Tree_C<T>' being compiled


Это сообщение отредактировал(а) tonchitos - 12.3.2008, 23:38


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


Опытный
**


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

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



Цитата(Lazin @  12.3.2008,  15:47 Найти цитируемый пост)
тогда уж проще использовать просто list<T>, который будет сортироваться за то-же время что и твое дерево
к тому-же узел дерева у которого есть итераторы, методы insert, push_back и тд. выглядит не как узел дерева, а как список(он и есть список) 

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

обратите, пожайлуста, внимание:
template <class T>
class Tree : public std::list<Tree<T> >

Tree<int> t;
можна написать как:
list<list<list<list.....<list<int> > >......> t; //(возможно бесконечное число вложений. хотя так его описать нельзя, т.к. к каждому листу еще надо присоединить int data)

извените конечно, но узел он и есть список.
можна конечно делать такое дерево (узел содержит 3 списка).
struct node
{
    node* next;
    node* firstChild;
    node* parent;
}

но если устраивает такое (что у меня вообщем то и есть):
struct
{
    node* firstChild;
}
т.е. единственно, узел не знает о родителе и соседних клетках, а в большинстве случаев в этом нету необходимости (обход дерева идет с корня).
а если все же надо передвигаться по дереву снизу вверх, можна добавить в класс Tree инфу о родителе.

Цитата
и еще, дерево должно быть из элементов сложных, ну я имею в виду что узел дерева должен быть структурой с несколькими полями данных.

это дерево может работать с любыми данными

Цитата(tonchitos @  12.3.2008,  16:38 Найти цитируемый пост)
вот вставила в прогу кусок с листом, ошибки...

дайте листинг кода и номер строки на которой ошибка.

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


Опытный
**


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

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



ошибка тут

operator < (const Tree_C<T> & node) {return data < node.data};

код? у мя проект большой.... только если весь проект.
Тк в этом файле ниче кроме этого контейнера.


Я так и не пойму как это ботает, ну разьясните плиз.

примерчик еще хочу


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


Опытный
**


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

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



operator < (const Tree_C<T> & node) {return data < node.data};
тут ; не там стоит
operator < (const Tree_C<T> & node) {return data < node.data;}

листинг я имел ввиду, листинг класса Tree
и строку как объявлен объект класса.

PM   Вверх
tonchitos
Дата 12.3.2008, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не помогло...


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


Опытный
**


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

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



создание бинарного дерева, по типу, как это делалось тут: http://forum.vingrad.ru/forum/topic-200066.html

Код

void MakeTree (Tree<int>& node, int n)
{
    node.data = n;
    int n1, n2;
    if ( n == 1 ) return;//ограничение рекурсии
    n1 = n / 2;//размеры левого 
    n2 = n - n1 - 1;//и правого поддеревьев
    node.push_back(Tree<int>());
    MakeTree(*(--node.end()));
    if (n2 > 0)
    {
       node.push_back(Tree<int>());
       MakeTree(*(--node.end()));
    }
    return Tree;
}


Tree<int> root;
MakeTree(root, 20);


Добавлено через 2 минуты и 20 секунд
дайте вот это:
листинг я имел ввиду, листинг класса Tree
и строку как объявлен объект класса.
что за компилятор
и вообще, ICQ есть? а то сейчас это все растянется на кучу страниц.
PM   Вверх
korian
Дата 12.3.2008, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

#include <list>

template <class T>
class Tree : public std::list<Tree<T> >
{
public:
   inline bool 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;
};

template <class T>
inline bool operator < (const Tree<T> & node1, const Tree<T> & node2) {return node1.operator < (node2);}


PM   Вверх
tonchitos
Дата 12.3.2008, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



на работе мне предложили так:

Код

namespace GUI
{
    class Node 
    {
        std::vector<Node> childs;
        std::string Name;
    public:
    
    int GetNumChilds ()
    {
    
        return childs.size();
    }
    const Node & GetChild (int pos) const
    {
        return childs[pos];
    }

    Node & GetChild (int pos)
    {
        return childs[pos];
    }

    bool insertChild (int pos, Node & element );
    bool removeChild (int pos);
    operator = (cont Node & from);
    }

}


тут с ошибками...

чем этот вариант лучше или хуже?

Добавлено @ 23:33
korian, ваш вариант загружается таки теперь  smile 

Это сообщение отредактировал(а) tonchitos - 12.3.2008, 23:34


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


Опытный
**


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

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



Цитата(tonchitos @  12.3.2008,  22:30 Найти цитируемый пост)
чем этот вариант лучше или хуже?

лучше, тем что названия функций имеют осмысленные названия.
а хуже тем, что используеться vector (про это раньше писалось, чем плохо), и в данном варианте жесткая привазка к нему.
все остальное, можна сказать, один к одному 
PM   Вверх
tonchitos
Дата 13.3.2008, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



мне сказали что лист не имеет ф-ии childs.size(); в отличие от вектора.
 smile 


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


Опытный
**


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

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



size у листа есть, у него нету доступа к елементам по индексу
PM   Вверх
tonchitos
Дата 13.3.2008, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ясно...

и еще, я понимаю, что надоела уже наверно.

Но как лучше сохранить в файл это дерево?
 smile 


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


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


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

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



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

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

Ситуация А) мы создаём дерево и наследуем его от list'а, это приводит к нарушению инкапсуляции так как теперь дерево может запросто быть преобразовано в list, там где это не надо.

Ситуация Б) мы создаём дерево и не наследуем его от list'а, это не приводит к нарушению инкапсуляции так как теперь дерево не может запросто быть преобразовано в list, там где это не надо.

Инкапсуляцию вижу, грабли  не обнаружены. 

Цитата(korian @  13.3.2008,  04:44 Найти цитируемый пост)
size у листа есть, у него нету доступа к елементам по индексу 

Грабли вижу, инкапсуляция не обнаружена. Меня как пользователя дерева не колышет что есть у листа а что нет. Если у него нет доступа к i-ому элементу, это его личные проблемы. меня как пользователя дерева они вообще не должны  волновать.

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

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

Не надо вводить человека в заблуждение. PImpl сюда прикручивается в несколько пинков, а с ним клиентский код ВООБЩЕ не будет зависеть от листов/векторов/деков.   В случае с наследованием от листа/вектора/дека сделать код не зависимым от базового типа НЕВОЗМОЖНО в принципе. Поэтому про жесткую привязку --- это относится к наследованию нежели к композиции.




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Страницы: (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.0564 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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