Russian Qt Forum

Qt => Общие вопросы => Тема начата: White Owl от Ноябрь 18, 2010, 23:33



Название: Дерево нужно
Отправлено: White Owl от Ноябрь 18, 2010, 23:33
Нужно дерево основаное на примитивных типах. Не ГУИ объект, а тип данных.

В принципе, QObject уже умеет иметь детей и может быть использован как абстрактная нода, но всяческие QString и QVariant не являются потомками от QObject. Соответсвенно чтобы сделать дерево на основе строк приходится делать свой класс:
Код:
class StringObject: public QObject, public QString {
Q_OBJECT
public:
StringObject();
StringObject(const QString& value): QString(value) {}
};

Или я не туда смотрю и все намного проще?


Название: Re: Дерево нужно
Отправлено: asvil от Ноябрь 19, 2010, 00:38
qthelp://com.trolltech.qt.460/qdoc/qstandarditemmodel.html


Название: Re: Дерево нужно
Отправлено: White Owl от Ноябрь 19, 2010, 01:41
qthelp://com.trolltech.qt.460/qdoc/qstandarditemmodel.html
Повторяю для тех кто не умеет читать: НЕ ГУИ! Просто тип данных.

Вот QList<> в стандартной библиотеке есть, а QTree<> или QNode<> нету. Спрашивается, почему? и что вместо них?


Название: Re: Дерево нужно
Отправлено: Barmaglodd от Ноябрь 19, 2010, 07:57
А там и не ГУЙ ;) Ничего похожего на дерево в Qt нет, если не нравится делай сам.


Название: Re: Дерево нужно
Отправлено: lit-uriy от Ноябрь 19, 2010, 10:21
White Owl, штатного дерева в Qt нет.
Но готовый код элемента дерева есть в примере Editable Tree Model


Название: Re: Дерево нужно
Отправлено: SimpleSunny от Ноябрь 19, 2010, 10:33
Не только в Qt, в с++ тоже нет своего штатного дерева.

Посмотрите эту реализацию, когда ее хотели в boost включить
http://tree.phi-sci.com/

QMap и QSet также являются деревьями и во многих случаях можно использовать их.


Название: Re: Дерево нужно
Отправлено: Igors от Ноябрь 19, 2010, 12:14
Вот QList<> в стандартной библиотеке есть, а QTree<> или QNode<> нету. Спрашивается, почему? и что вместо них?
Потому что полагается что программист умеет создавать свои структуры данных (а не только пользовать чужие)


Название: Re: Дерево нужно
Отправлено: kirill от Ноябрь 19, 2010, 15:34
QVariantList может делать детей в т.ч. и из QVariantList

QVariantList tree;
QVariantList node1;
QString leaf1;
QString leaf2;

QVariantList node2;

node1.append(leaf1);
node1.append(leaf2);
tree.append(node1);
tree.append(node2);

foreach (QVariant v, tree)
{
   if (v.canConvert(QVariant::List))
   {
         QVariantList ls = v.toList();
         //рекурсия
   }
}


Название: Re: Дерево нужно
Отправлено: White Owl от Ноябрь 19, 2010, 21:13
Вот QList<> в стандартной библиотеке есть, а QTree<> или QNode<> нету. Спрашивается, почему? и что вместо них?
Потому что полагается что программист умеет создавать свои структуры данных (а не только пользовать чужие)
Во! Самое классное объяснение! Тогда, пусть "гуру общения" объяснит мне почему существует QList<>? Или по твоему мнению работать со коллекцией намного сложнее чем с деревьями и каждый программист обязан уметь делать свое дерево, но не обязан уметь делать коллекции? :)

Я понимаю что многие-многие стандартные структуры используют деревья в качестве хранилища внутренних данных, и понимаю что можно сделать дерево на основе любого из коллекционных шаблонов (уже упоминались QList, QMap, QSet).
Но я не понимаю, почему не включили деревья в стандартный набор шаблонов?
Запросто ж можно сделать шаблон типа "template Node<T, child_count>" А на его основе уже делать шаблоны всяческих деревьев. И универсальных многодетных, и бинарных как частный случай универсальных, и всяческие AVL-, RedBlack- как частный случай бинарных...


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


Название: Re: Дерево нужно
Отправлено: lit-uriy от Ноябрь 20, 2010, 02:24
дерево мене однородно, чем список.
А список, словарь, вектор - контейнеры и под них написаны и алгоритмы и итераторы. А вот для дерева их сделать уже сложнее.


Один вариант готового дерева я тебе подсказал, второй вариант - Kirill.


Название: Re: Дерево нужно
Отправлено: Igors от Ноябрь 20, 2010, 14:33
Во! Самое классное объяснение! Тогда, пусть "гуру общения" объяснит мне почему существует QList<>? Или по твоему мнению ..
Но я не понимаю, почему не включили деревья в стандартный набор шаблонов?
Др. дело если дерево заточено для поиска - ну такие и включены (std::set, QSet). А "просто дерево" не имеет той общности. Сделать его на template никто не запрещает но особых выгод не видно. Вот просто пример
Код
C++ (Qt)
struct CNode {
CNode * LookupRecursive( TLookupProc theLookup );
 ..          // др.методы
 
// данные
int mID;
QString mName;
CNode * mParent;  // возможно указатель на parent
....             // др.данные
QList <CNode *> mChildren;  // контейнер указателей на детей
};
 
Чего не хватает? Зачем нужно упорно изыскивать шаблоны, заучивать классы и.т.п. вместо того чтобы просто написать свое за 10 минут? Чем оно хуже и почему надо обязательно что-то "знать" (и, как часто бывает, с радостью топтать тех кто "не знает!")? Программирование не было и не будет соревнованием "кто больше запомнит". Слишком уж хорошее знание STL часто есть "Блеск и нищета куртизанок"  :)