В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
1 | ||||||
Реализовать двунаправленный список в духе списка из STL11.02.2011, 20:37. Показов 6384. Ответов 44
Метки нет (Все метки)
Все-таки видимо у меня всегда останутся с этим проблемы.
Само определение скидывать не буду, я пытаюсь сделать, что-то вроде STL-ного списка. Спросить хочу только одно.
Хотя вообще как я понял это для однонаправленного только катит... А вот как сделать для двунаправленного - второй день догнать не могу.
0
|
11.02.2011, 20:37 | |
Ответы с готовыми решениями:
44
Двунаправленный список (добавление/удаление элементов в голову, просмотр списка, реализовать дублирование элементов с заданным значением) Двунаправленный список. Отрицательные элементы списка перенести в начало списка Двунаправленный список - реализовать работу с данными о ПК Реализовать пользовательский класс "Двунаправленный список"; реализовать добавление и удаление элементов |
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
||||||
13.02.2011, 02:06 | 21 | |||||
Ну да, это не решение. Сейчас подумаю.
Добавлено через 10 минут Забавно, у меня та же фигня. При этом если поставить вместо "size_t" "int", то работает. Добавлено через 3 минуты Ну всё ясно, это глюк языка. В СБШ это решается хитрым способом:
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
13.02.2011, 02:07 [ТС] | 22 |
volovzi, Ну это тоже не особо решение. Так и отрицательный размер задать можно. Конечно, можно контролировать, но тоже не весело... Первый раз такое вижу. При реализации вектора - этого не было.
Ого. Вот так круто. Спасибо) Попробую.
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
13.02.2011, 02:14 | 23 |
ForEveR, не волнуйся, если стд::листу задать отрицательный размер, то он будет точно так же обрабатываться.
Так что на данном этапе я бы забил на лишние сложности и оставил инт.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
13.02.2011, 11:51 [ТС] | 24 | |||||
Ну вот пока сырой конечно, но реализовано почти все и все проверено. Сырой, так как нету обработки ошибок (буду делать позже), не понимаю как сделать sort. Собственно по сути все) Можно конечно пойти хитрым путем, вкинуть в вектор, отсортировать - вкинуть обратно в список. Но кажись это жульничество. + код не комментирован, функции разбросаны кто где, оформление хромает. Код бросаю под кат.
И с unique(predicate) что-то странное творится. Я не могу найти этому объяснение. При unique сравниваются на равенство - работает как надо. При unique(pred) с предикатом сравнивания на равенство - удаляется лишнее число. List<T>
Добавлено через 6 часов 26 минут Соответственно, я буду рад, если кто-то посмотрит, укажет на недочеты. Подскажет как организовать оставшиеся функции (ну sort к примеру... писать быструю сортировку или сортировку как std::sort вообще как-то желания ноль)...
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
13.02.2011, 14:07 | 25 |
Что увидел при первом просмотре:
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
13.02.2011, 14:27 [ТС] | 26 |
volovzi, опечатка в const_reverse_iterator rbegin() а не в reverse_iterator rbegin(), проверял вывод через copy на reverse.
Остальное - посмотрю завтра. Спасибо
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
14.02.2011, 19:14 [ТС] | 27 |
volovzi,
1) Согласен 2) Согласен 3) Можно... Но я ведь не собираюсь моделировать полностью работу стандартного списка... Я вообще не знаю, зачем это делаю... Наверное, чтобы понять как это устроено. Если менять, то как по сути должно быть? Алгоритм действий я имею ввиду. 4) Аналогично, немного не понял как делать то, что ты предложил. 5) Подозревал. Перестарался. Но почему-то мне кажется, что так удобнее... Стоит убрать? 7) Можно было... Но в таком случае можно было использовать и iterator/const_iterator. Сделать просто typedef типа typedef std::list<T>::iterator iterator... Ну и плюс к тому, копии настоящего все равно не получится, ибо с аллокатором парится не очень хочется. Для вектора он реализовался легко, можно его и взять, но там в списке какие-то хитрости с rebind используются. А что ты думаешь насчет сортировки? Как лучше делать? (алгоритм)
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
||||||
14.02.2011, 19:24 | 28 | |||||
3. В стандартном, как раз, как у тебя . Просто мне кажется, что это нерационально.
4. См. пример. 5. Можно и оставить, просто если ты будешь передавать список куда-то в алгоритм, который не предназначен для списка, то он может работать неопределённое время. Вот мой пример. Erase(iter, iter) у меня нестандартный, а вот swap и стандартный, и правильный. list<T>
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
14.02.2011, 19:28 [ТС] | 29 |
volovzi, Ммм.. Да. Интересно на тему erase. Своп жутко понравился)
0
|
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
|
|
14.02.2011, 21:43 | 30 |
Можете подсказать, в односвязном списке обязательно должно быть 2 указателя, на начальный и конечный элементы списка, или можно обойтись одним, только на начальный элемент?
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
15.02.2011, 00:58 [ТС] | 31 | |||||
Добавил некоторую обработку ошибок. Не знаю правда как обрабатывать выход из диапазона итератора...
Пожаления/дополнения/советы приветствуются. На merge/sort стоят заглушки, которые я не думаю, что буду переделывать. Собственно все по-сути. Список
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
||||||
15.02.2011, 01:05 | 32 | |||||
Универсальной сортировкой при помощи итераторов могу поделиться.
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.02.2011, 01:12 [ТС] | 33 |
volovzi, Оу. Про очищение не прочитал что-то.
clear() то вставить без проблем. Но вроде как это нечестно. Я верно понимаю?)
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
15.02.2011, 01:21 | 34 |
ForEveR, не знаю, в исходниках эта функция спрятана. Но лично я бы не копировал, а встроил второй список в первый тем же способом, которым предлагал делать insert(iterator, iterator), т.е переприсвоил соответствующие указатели без физического переноса узлов.
Кстати, в этом случае не надо считать количество элементов, т.к. их число явно известно, т.е. перенос можно осуществить за О(1). Ну а от сортировки уже никуда не денешься...
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.02.2011, 19:12 [ТС] | 35 |
volovzi, Остальное-то все относительно нормально кроме sort/merge?
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
15.02.2011, 20:46 | 36 |
ForEveR, всегда можно найти, что улучшить .
Например, в присвоении я бы не делал проверку на равенство. Ответственность за неё должна лежать на пользователе. То же самое — проверка в функциях «back()» и «front()». Это пользователь должен проверять, есть ли что-нибудь в списке. Аналогично и в функции «resize(size_t, const T &)» я бы не стал делать проверку на положительность размера. Но если уж ты обрабатываешь ошибки и не кидаешь исключение, то тогда нельзя завершать программу (кстати, что такое «terminate»?), а надо сообщить об ошибке и продолжить работу.
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.02.2011, 22:11 [ТС] | 37 |
volovzi, terminate() вызов завершения программы. А искл я кидаю впринципе. _DEBUG_ERROR(msg) он пишет ошибку прямо в окне. Не в консоли пишет, а при выводе окна о том, что ошибка программа завершена из-за ошибки - пишет это сообщение... а terminate() это то, что происходит после runtime_error по сути.
На равенство... Хм... Просто привык, чтобы это было. back/front по стандарту контролируются итератором насколько я понимаю. А в resize проверка из-за типа int, но наверное тоже не особо нужна
0
|
15.04.2011, 18:37 | 38 | ||||||||||
Вот интересовался, смотрел исключительно реализации итераторов.
То как это сделано в сообщении #31, не вижу особого смысла в наследовании:
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.04.2011, 19:56 [ТС] | 39 |
bigredcat, Загляните в реализацию STL на досуге.
0
|
16.04.2011, 06:15 | 40 |
ForEveR, так в первую очередь туда и заглядывал. Интересовался, как другие этот огород городят. Но у вас практически тоже самое.
0
|
16.04.2011, 06:15 | |
16.04.2011, 06:15 | |
Помогаю со студенческими работами здесь
40
Двунаправленный список: элементы добавляются и просматриваются с конца, а удаляются с начала списка STL: реализовать кольцевой упорядоченный двусвязный список Реализовать удаление элемента из пользовательского класса "Двунаправленный список" реализовать без применения STL, абстрактные типы данных (по одной программе для каждого из типов) список, стек Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |