![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| tonchitos |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 447 Регистрация: 24.2.2007 Репутация: нет Всего: 40 |
у меня два дерева. Одно дерево как структура данных, другое как графическая(treectrl). Деревья одинаковы, те имеют одинаковую структуру и имена. В одном дереве выбран какой-то потомок.
Нужно найти этого потомка в другом дереве. Предположим имена в разных ветках могут совпадать, но не могут совпадать 2 ветки одного уровня.те у одного родителя не может быть 2х детей с одинаковыми именами. мое дерево
що делать. -------------------- – Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил. |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
спецально для таких вопросов создана ветка для новичков
|
|||
|
||||
| tonchitos |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 447 Регистрация: 24.2.2007 Репутация: нет Всего: 40 |
вот я примерно так сделала:
не красиво? -------------------- – Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
вообще-то это не очень верно. На одном уровне могут быть разные имена, но у разных веток:
Искать нужно опять рекурсивно. Для этого сначала нужно собрать все имена нодов от текущего до корня (дерева в диалоге). А потом, последовательно выбирать нужные имена в другом дереве. Кстати, тебе не надоело везде писать std::vector<Node>?.. Может стоит сделать typedef std::vector<Node> Nodes? |
|||
|
||||
| tonchitos |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 447 Регистрация: 24.2.2007 Репутация: нет Всего: 40 |
bsa, спасибо. Я предпологала отсутствие совпадений у одного родителя
типа нельзя так: рут нод1 нод1 typedef std сделать надо, но тогда все то исправлять.... Или не полениться, тк нехороший тон? -------------------- – Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Вот скажи, тебе не лень писать std::vector<Node> каждый раз? А если потом выяснится, что вместо vector надо использовать map или list? Что делать будешь?
Имхо, делать typedef - это не правило хорошего тона, это просто правило. Потому что рано или поздно могут возникнуть следующие вещи: std::vector< std::list< std::map<std::string, std::vector<std::queue<int> > > > >... попробуй пойми, что автор этого имел в виду |
|||
|
||||
| tonchitos |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 447 Регистрация: 24.2.2007 Репутация: нет Всего: 40 |
я организовала успешно поиск одного элемента дерева в другом, но того кто дал мне задание это не устроило
три варианта на выбор было мне предложено. У каждого элемента дерева должен быть свой идентификатор и этот идентификатор надо связать с каждым элементом в графическом дереве и поиск осуществлять по индивидуальному идентификатору. либо связывать с каждым элементом дерева графического информацию о участке памяти, где хранится соответствующий узел (что не гуд, тк при ресайзе вектора смещается все на фик). третий вариант - мой, для каждого узла дерева хранить HTREEITEM графического узла (тогда тож искать надо). Вариант с памятью самый симпотичный в смысле ненужности поиска. В общем что предпочесть и есть ли поле в триконтроле в котором можно хранить некую информацию типа лонг например? Добавлено через 52 секунды
вот сама деревяшка -------------------- – Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил. |
|||
|
||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
вау! оказывается, возможны варианты... а я постеснялся предложить
это правильное решение. обрати внимание: тебе видимо нужна двунаправленная связь: щелкаем по элементу в treectrl - работаем с деревом в памяти, изменяем дерево в памяти - обновляем treectrl. Искать нужно в любом случае, либо хранить обе ссылки. Однако это вид должен все знать про документ, а не наоборот. Так что присваиваем идентификаторы узлам дерева и храним их как ссылки в treectrl. Производительность: когда манипулируем с treectrl (пользователь щелкнул на элементе) скорость неважна, т.к. пользователь 0.1 сек всегда подождет. Когда обновляем treectrl - стараемся это делать редко, когда все операции завершены и, возможно, просто перестраиваем treectrl - тут искать не надо, просто обходим.
есть. ищи SetItemData/GetItemData Добавлено @ 22:19 PS. Тебя явно одновременно воспитывают и проверяют, и вообще ведут себя грамотно Не расслабляйся Добавлено @ 22:23 PPS Помню года 3-4 назад пришлось оптимизировать фрагмент кода: прога тормозила в процессе расчета. Оказалось: было дерево ~100 узлов, при этом было примерно ~1000000!! обращений в дерево. А дело было в том, что данные хранилось непосредственно в treectrl, никакой доп. информации не было, и при необходимости получить нужный узел производился последовательный просмотр содержимого дерева... Это сообщение отредактировал(а) baldina - 19.3.2008, 22:25 |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
tonchitos, в качестве идентификатора уже служит имя нода (у тебя же дети одного нода не могут носить одно имя, так?)... И именно этот способ я предлагал использовать в пред-предыдущем своем сообщении (я его довольно невнятно сформулировал, правда). Ты каждый элемент графического дерева ассоциируешь с именем нода в памяти, а поиск производишь рекурсивно:
И тебе точно нужно поле level? Я так понимаю, особой смысловой нагрузки оно не несет. |
|||
|
||||
| tonchitos |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 447 Регистрация: 24.2.2007 Репутация: нет Всего: 40 |
bsa, имя нода не катит оказывается
baldina, спасибо. У меня как раз задача - предполагается что дерево очень большим будет, поэтому все дерево не буду загружать, велели найти ф-ии или контрл где нажатие плюсиков (разворот-сворот чайлдов) можно отследить, тогда при нажатии на плюсик потомки будут загружаться в контрл, при закрытии плюсика - выгружаться. Мне нужно отслеживать че с плюсиками делают, плюс задавать для каждого чайлда отображать их или нет. Уходя с работы я еще поговорила и от моих трех вариантов один остался.
этот вариант мне предложили сами, но не одобряют тк память. Люди, если ресайза избежать можно быть за память уверенной? Фиг его знает как там вектор шалит.
вариант отмели, тк у каждого дерева может быть несколько графических деревьев. воть. я сделала первый вариант, но использовала статическое поле для хранение последнего идентификатора. не прошло, тк мне сказали что деревьев может быть несколько (а я то обрадовалась тк каждый узел - объект моего класса и общее поле иметь удобно. облом). В итоге катит первый вариант с идентификаторами. Возможен второй, но под вопросом. -------------------- – Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил. |
||||
|
|||||
| tonchitos |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 447 Регистрация: 24.2.2007 Репутация: нет Всего: 40 |
теперь новый момент:
мне сказали чтобы у меня верхушка дерева хранила другие данные нежели все узлы (последний использованный идентификатор и тп)... варианты.
и потом : GUI::Node node; GUI::Root root; ................. ................ root.childs.resize(n); и так работать но чего то мне не нравится. Работаем с рутом, а методы используем нода. Тогда лучше отнаследовать? рут от нода. в общем напишите мне плиз соображения как лутьше. или еще какие варианты будут? нужно хранить некие данные для каждого дерева хде то... Добавлено через 36 секунд bsa, тайпдеф сделаю!!!! утром займусь этим обязательно. -------------------- – Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Я не понял, у одного нода могут быть чилды с одинаковыми именами?
На память завязываться очень плохо (особенно, при использовании векторов). С идентификаторами тоже есть сложность - как их генерировать (вариант "статический счетчик" имеет ограничение на количество значений, например)... Хотя можно перейти с векторов нодов на вектора указателей на ноды, тогда можно будет использовать "память"... Но возникнут некоторые сложности при удалении нодов (придется следить за этим и делать соответствующие действия с графическим деревом). В данном случае рут просится быть наследником нода. Хотя, если тебе нужно следить за обращениями к нодам, то лучше использовать не наследование, а агрегацию (включение), но те так как у тебя сделано:
typedef сделать не так уж и сложно (Правка - Найти и заменить: "std::vector<Node>" на "Nodes", а потом добавить в класс typedef std::vector<Node> Nodes; - и всё). |
|||
|
||||
| tonchitos |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 447 Регистрация: 24.2.2007 Репутация: нет Всего: 40 |
в руте нужно пока хранить тока последнее значение... эмс, а можно поподробнее про агрегацию
-------------------- – Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
tonchitos, у меня в последнем примере сделана агрегация.
|
|||
|
||||
| tonchitos |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 447 Регистрация: 24.2.2007 Репутация: нет Всего: 40 |
сорри, не оч поняла смысл гетНода... Объясните плиз.
Добавлено через 2 минуты и 11 секунд class Root { public: Root() { } ~Root() { } const Node& getNode() const { return node; } Node& getNode() { return node; } private: Node node; long lastIdent; // как предполагается менять его, если у меня в ноде по идее меняться должен и не в ноде тоже }; -------------------- – Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |