7 / 7 / 0
Регистрация: 11.06.2023
Сообщений: 21
|
|||||||||||
1 | |||||||||||
Конструктор копирование в Trie (префиксное дерево)31.12.2023, 12:59. Показов 964. Ответов 12
Дорогие форумчане, с наступающим 2024 годом всех! Но пусть праздники и близки, увы, отдохнуть получается не у всех.
Итак, в чём суть проблемы: нужно написать хеш-таблицу и префиксное дерево(trie), закинуть много чисел в них, а затем провести поиск ста ключей(50% - есть в структурах, 25% - нет и они больше 100'000'000 или меньше 10'000'000(но положительны!) и 25% - нет, но они все в в полуинтервале [10'000'000; 100'000'000). Числа в структурах в этом же диапазоне) И всём было прекрасно - структуры поиска написаны, всё работает, но! случилась беда - я тупой. А если конкретнее, то просто не понимаю как именно написать конструктор копирования(оператор присваивания копированием так же) для trie Сама структура поиска(на comparations не обращайте внимание они нужны для анализа сравнений при поиске ключей):
0
|
31.12.2023, 12:59 | |
Ответы с готовыми решениями:
12
Для заданного trie дерева построить trie дерево, в котором все слова расположены в обратном порядке c++ Префиксное дерево префиксное дерево Trie дерево Префиксное дерево, проверка на корректность |
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
31.12.2023, 13:28 | 2 |
Что не ясно-то? Создаёшь копию этой структуры с обходом и выделением памяти.
0
|
1046 / 967 / 153
Регистрация: 10.08.2015
Сообщений: 5,221
|
|
31.12.2023, 19:35 | 3 |
Сначала деструктор правильно сделай. Это важнее.
0
|
фрилансер
5848 / 5379 / 1103
Регистрация: 11.10.2019
Сообщений: 14,380
|
|
31.12.2023, 21:27 | 4 |
- пропущен const
- и тут тоже ошибка а тут очепятка - это слово - уже множественное, s не не надо
1
|
7 / 7 / 0
Регистрация: 11.06.2023
Сообщений: 21
|
|
31.12.2023, 21:45 [ТС] | 5 |
Пасиба.
Эм, и в чём же? Если файл не кончился(у меня весь файл из чисел), то возвращается false, который нужно переделать в true, чтобы цикл продолжился? А когда файл закончился, что всё наоборот. У меня написано точно так же как и у Вас. Пасиба. Поясните в чём неправильность деструктора? Он полностью очищает память, которую ест структура при insert. А если и добавлений не было, то структура не потребила память, а значит сама спокойно удалилась. Делитать нулы не имеет смысла.
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
31.12.2023, 22:13 | 6 |
1
|
1046 / 967 / 153
Регистрация: 10.08.2015
Сообщений: 5,221
|
|
01.01.2024, 01:20 | 7 |
Удаляешь верхний уровень , допуская утечку памяти. Главная ошибка в программировании на с++.
0
|
7 / 7 / 0
Регистрация: 11.06.2023
Сообщений: 21
|
|
01.01.2024, 02:12 [ТС] | 8 |
vlisp, так погодите. Смотрите, в корневом узле лежит массив указателей. Они, возможно, указывают на динамическую память, а возможно нет(помним, что указатели на trie). Условимся, что один точно указывает, тогда, при вызове деструктора он будет удалëн посредством вызова дэлит для него, а значит все указатели в его массиве указателей тоже будут очищены, если что-то содержали. Дэлит - вызывает деструктор и передаëт память системе. То есть, сначала динамический trie будет очищен деструктором, а у него деструктор дэлитит всех его детей, а затем память передастся системе. Нафига мне уничтожать узлы с самого низа, если с++ делает всë за меня? Попробуйте протестировать данную структуру на утечку(это несложно) - еë нет. А если корневой узел создан динамически, то это уже проблемма программиста его удалить, но в таком случае деструктор тоже спокойно удалит всех детей.
предположим, что я удаляю корневой узел, а в самом дереве лежит 00, тогда это выглядит так: delete trie root-> ~trie root -> delete trie 0 -> ~trie 0 -> delete trie 0-> ~trie 0 Затем идëм обратно отдавая память системе. Вот и всë. У меня же не сязный список, а скорее многомерный массив. Если простейшими структурами описывать
0
|
01.01.2024, 22:20 | 9 | |||||
Конструктор копии можно сделать таким же рекурсивным как и деструктор
1
|
Вездепух
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,881
|
|
01.01.2024, 22:27 | 10 |
Проверка статуса
eof для потока в стандартных библиотеках С и С++ предназначена для "постмортемного" анализа, почему завершилось чтение (если вы захотите сделать такой анализ). Это пост-статус. Пост-статус не пригоден в качестве пред-условия для "чтения файла до конца" (как у вас). Это просто не будет работать правильно.Проверка статуса eof так, как вы ее делаете, не имеет никакого отношения к тому, кончился файл или нет.Объясните, почему вы решили, что написанное вами while (!file.eof()) { - это "если файл не кончился". Распишите логическую цепочку: как от второго вы перешли к первому.
1
|
7 / 7 / 0
Регистрация: 11.06.2023
Сообщений: 21
|
|||||||||||
02.01.2024, 02:37 [ТС] | 11 | ||||||||||
igorrr37, Возможно, Ваша программа работает неплохо, но жаль, что мне нельзя использовать STL. Поэтому я написал такой конструктор копирования:
Наверное, потому что так пишут все курсы? То, что так лучше не писать я понял уже из сообщения DrOffset, а Ваше ещё больше уверило меня в этом. Спасибо Заодно, если Вам несложно, то могли бы Вы предложить варианты как проверять файл на законченность, если содержание файла неизвестно?
0
|
фрилансер
5848 / 5379 / 1103
Регистрация: 11.10.2019
Сообщений: 14,380
|
|
02.01.2024, 06:27 | 12 |
бежать подальше от таких всех курсов. Это где такие?
хм, а это что Добавлено через 1 минуту попытаться прочитать очередную запись. Если не удалось - файл закончился
1
|
Вездепух
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,881
|
||||||
02.01.2024, 11:29 | 13 | |||||
Вам на самом деле нужно не "проверять файл на законченность", а проверять операцию ввода-вывода на успешность. Операция ввода-вывода может отказаться работать по многим причинам, не только из-за того, что файл завершился. Вы же почему-то игнорируете все остальное.
Именно так и делается ввод-вывод в стандартной библиотеке С и С++: файл читается до тех пор, пока операции ввода-вывода успешно выполняются. Ключевой момент здесь то, что такая проверка делается после каждой операции ввода-вывода
1
|
02.01.2024, 11:29 | |
02.01.2024, 11:29 | |
Помогаю со студенческими работами здесь
13
Как реализовать префиксное дерево на C#? Префиксное дерево си, удаление записи Дерево Trie, добавление Trie дерево, реализовать вставку Trie, (нагруженное дерево) процедура добавления Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |