Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. От приведённого ниже кода ожидаю получить следующий результат: Ожидаемый результат{ Thor, Odin, Freia } { Hera, Ares, Poseidon, Zeus } Однако по факту получаю такое: Фактический результат{ Thor, Odin, Zeus } { Hera, Ares, Poseidon, Zeus } Не пойму, почему из первого списка не исчез Zeus... Freia понятно почему исчезла - потому, что в Zeus указатели обнулены, но ведь в функции erase элементу Odin так же была переназначена ссылка на Freia, вместо Zeus... исходный код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. Уже все глаза просмотрел на функцию erase, никак не соображу в чём дело... Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2013, 18:32 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
Ошибка в insert. Если ты ставишь p перед n, то не надо трогать указатель p->prev. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2013, 20:26 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
White Owl, Да, спасибо, пока ехал в метро, тоже нашёл эту ошибку. Рабочий вариант такой: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. White Owlто не надо трогать указатель p->prev. Не согласен. Указатель трогать нужно, но только при выполнении добавленного мною выше условия, иначе не будет корректно работать такой вариант вызова: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2013, 20:49 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
CompositumРабочий вариант такой Рабочий вариант такой: std::list ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2013, 21:43 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyCompositumРабочий вариант такой Рабочий вариант такой: std::list Я выполняю задания по книге Стровструпа. С их помощью он разъясняет работу STL, постепенно усложняя реализацию от простого к более сложному. О наличии std::list я в курсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2013, 21:47 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
Compositum, Какой-то у вас смешанный стиль. Это плохо. Ну в смысле на это стоит затачиваться уже в самом начале, соблюдать чистоту стиля. Вроде бы c-style список, и на! тебе исключения, new, namespaces, функции-члены. Постепенное усложнение должно выглядеть не знаю как, но точно не так. Ну хотя бы использовать класс, скрыть указатели за асбтракцией итератора, определить типы итераторов, интенсивнее использовать const, throw спецификацию в функциях, определить уровень безопасности по исключениям для каждой функции, специфицировать стандартные алгоритмы для вашей структуры данных, ввести аллокатор, добавить шаблонность и тд и тп. Это для плюсплюсстайл. Для си-стайла, тоже совсем другой путь, выкинуть все плюс-специфик, сделать общий node на основе наследования, перенести поле данных в придаток POD структуры (в конец, в виде char[1]), определить макросы для основных операций, написать килотонны макросов, сломать моск, превратиться в гик, начать использовать гиккод, уйти в лес, разработать систему возврата ошибок, использовать c-style выделение памяти и тд, можно посмотреть kqueue, klist во FreeBSD. В чем именно заключается смешение? Исключения + new + возврат nullptr (причем неверный) из функций new + открытые наружу указатели namespace + struct наименования методов из стандартной библиотеки + совершенно различные сигнатуры, несовместимость с стд алгоритмами struct + std::string struct + member functions + constructor и тд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 10:47 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
sherzod_интенсивнее использовать throw спецификацию в функцияхникогда не надо использовать throw спецификацию, злостное зло эта спецификация. sherzod_namespace + struct struct + std::string struct + member functions + constructor struct то чем пугает? это тоже самое, что и класс, только с другой областью видимости по умолчанию. Больше отличий - нет. sherzod_наименования методов из стандартной библиотеки + совершенно различные сигнатуры, несовместимость с стд алгоритмамиединственное полезное замечание, но, как я понимаю, Compositum до стд ещё не дочитал )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 11:52 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
sherzod_, Throw specification уже отменили, забанили навсегда... Человек явно учиться, делает на с++ базовые низко уравневые вещи из с. Ничего плохого нет в смещении стилей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 12:01 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
sherzod_, Это для плюсплюсстайл К счастью, с++ стиль может быть разным, ни stl, ни итераторы шизонутые использовать вовсе не обязательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 12:05 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
sherzod_Вроде бы c-style список, и на! тебе исключения, new, namespaces, функции-члены. Постепенное усложнение должно выглядеть не знаю как, но точно не так. Я как-то Стровструпу больше доверяю :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 12:26 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
насчет throw спецификации, не надо придираться к словам, признаю не точно выразился, но имелся в виду вот этот документ http://www.boost.org/community/exception_safety.html и явное указание к какому уровню по безопасности по исключениям относится каждая функция член - например erase, то есть конкретно throw() без всякого списка, и его эквивалент noexcept, прошу прощения если не смог донести мысль. Compositum, egorych неужто Страуструп такому вот и учит, работать с си-стайл списком struct, через функции члены? И value он размещает в начале какой-бы то ни было структуры данных? А указатели на узлы после? Для вас это мелочи и вы между ними разницы не делаете? И функции не бросающие исключений у него никак не помечены, в новом или старом стандарте? И большого раздела нет, в котором он это подробно разъясняет? И детали реализации наружу выставляет? Покажите хотя бы одно место в какой либо его книге, где он в практическом примере контейнера (не для объяснения синтаксиса) использует конструктор для struct? И прямо так вот, с си-стайл списком он использует исключения? Из какой альтернативной вселенной все эти допущения? Читайте внимательнее. egorych, вы упустили мелочь - в си нет слова class и то что я говорил о смешении стилей, еще вы упустили из виду то, что плюсы могут компилировать си, могут использовать либы на си, да на самом деле вы многое упускаете если не делаете разницу между class и struct. Compositum, всего-то надо или сделать структуру и работать с ней свободными функциями, которые работают только с узлами, не обращая внимания на данные => неизбежно задумаетесь о правильном порядке ее элементов, -конструктор, -исключения, -пространства имен, +познакомитесь с принципами наследования в си или сделать класс, закрыть все поля реализации как минимум, потом нарастить шаблон, и все как стандартной библиотеке, +исключения, +безопасность по исключениям, +пространства имен, +шаблоны, +константность, +итераторы, +аллокаторы, -макросы, -си-стайл все что между - посредственно и от лукавого, почему? 100500 раз обсосано и разложено страуструпами, майерсами, дипперами и др. Элементарно вот эта строчка greek_gods = insert(greek_gods, new Link("Poseidon")); дает течь, и именно из-за смешения стилей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 16:58 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
sherzod_неужто Страуструп такому вот и учит, работать с си-стайл списком struct, через функции члены? И value он размещает в начале какой-бы то ни было структуры данных? А указатели на узлы после? Для вас это мелочи и вы между ними разницы не делаете? И функции не бросающие исключений у него никак не помечены, в новом или старом стандарте? И большого раздела нет, в котором он это подробно разъясняет? И детали реализации наружу выставляет? Покажите хотя бы одно место в какой либо его книге, где он в практическом примере контейнера (не для объяснения синтаксиса) использует конструктор для struct? И прямо так вот, с си-стайл списком он использует исключения? Из какой альтернативной вселенной все эти допущения? Читайте внимательнее. Я уже писал: 14476725 . Книга: "Программирование. Принципы и практика использования C++", глава 17. Для того, чтобы вы могли с удобством использовать тот же класс vector, кто-то должен был его реализовать, причём реализация порой содержит большое количество C кода, работающего с указателями и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 17:22 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
CompositumЯ уже писал: 14476725 . Книга: "Программирование. Принципы и практика использования C++", глава 17. Для того, чтобы вы могли с удобством использовать тот же класс vector, кто-то должен был его реализовать, причём реализация порой содержит большое количество C кода, работающего с указателями и т.п. Вы меня не поняли. Я совсем не к тому что, зачем вам велосипед, используйте std::list или std::vector. Я всеми руками за!, тренировку в реализации, считаю что это очень полезно. Вообще вы широком смысле полезно, для понимания работы стандартных контейнеров в частности. Я о том, что тот код который вы написали, совсем не такой как учит ну тот же Страуструп. Перепишите его используя class, закрытые члены. Не выставляйте указатели наружу. Выделяйте память под данные внутри функций-членов. Просто прочитайте мои вопросы и попробуйте на них ответить. Кстати в реализации std::vector практически нет C-стиль-кода. И он уж точно не сделан через структуру с конструктором, свободными функциями с указателями и исключениями. А если таки хотите си-стиль, просмотрите любую реализацию динамических списков в Си, в Си каждый клепает свою реализацию заточенную под задачу(, они все однообразные), и правильно делает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 17:59 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
sherzod_на самом деле вы многое упускаете если не делаете разницу между class и struct.что именно я упускаю? это одно и то же в С++. sherzod_или сделать структуру и работать с ней свободными функциями, которые работают только с узлами, не обращая внимания на данные => неизбежно задумаетесь о правильном порядке ее элементов, -конструктор, -исключения, -пространства имен, +познакомитесь с принципами наследования в си или сделать класс, закрыть все поля реализации как минимум, потом нарастить шаблон, и все как стандартной библиотеке, +исключения, +безопасность по исключениям, +пространства имен, +шаблоны, +константность, +итераторы, +аллокаторы, -макросы, -си-стайлэто чтобы жизнь малиной не казалась, что ли? Если есть необходимость в инкапсуляции - используете class, если нет, то берёте struct и не мучаете ни себя, ни окружающих, если не требуется, чтобы структура была POD, рисуете туда конструкторы, деструкторы и прочие, необходимые операторы и функции. Ваше "или-или" - это от лукавого. А учебный пример - на то и учебный пример, чтобы объяснять какую-то одну концепцию, в данном случае, как я понимаю, реализацию двусвязного списка. Понятное дело, что он в промышленный код не годится, но у него другая задача. Я думаю, начнётся глава 18, и Compositum будет свой С-костыль переделывать в С++, и спрашивать у нас, как там теперь чего )) не бегите впереди паровоза. А чтобы течь устранить, ему надо корректный деструктор к своему списку дописать, всего делов-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 18:12 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
egorychА чтобы течь устранить, ему надо корректный деструктор к своему списку дописать, всего делов-то. Причем там деструктор вообще? Правильное очищение списка еще даже не выносилось на обсуждение. Вот об этом я и говорю что вы упускаете многое нарушая принцип инкапсуляции. Нигде не встречал объекты с открытыми внутренними полями, ну кроме винды конечно, там всякие POINT-ы, RECT-ы, считаю идеальное собрание примеров того как не нужно писать на плюсах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 19:28 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
sherzod_, Вы из каких соображений не читаете то, что вам пишут? Вопрос риторический... sherzod_Я о том, что тот код который вы написали, совсем не такой как учит ну тот же Страуструп. Ну да, а K&R написали не Керниган и Ритчи... Вы, прежде чем подобные вещи писать, откройте обозначенную книгу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 19:37 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
Compositumsherzod_, Вы из каких соображений не читаете то, что вам пишут? Вопрос риторический... sherzod_Я о том, что тот код который вы написали, совсем не такой как учит ну тот же Страуструп. Ну да, а K&R написали не Керниган и Ритчи... Вы, прежде чем подобные вещи писать, откройте обозначенную книгу. Открыл, увидел, ахнул. Виноват, есть там подобный код. Мне было сложно в это поверить в свете вот этого , где разжевано на каких принципах должны быть построены контейнеры, в свете "язык С++" где нет ни единой структуры с конструктором. Насчет использования исключений в си-стайл списке я уже собрался было написать ему гневное письмо, за то что я так обломался из-за него, но вглядевшись в его вариант, слава богу я там этого не обнаружил. Ровно как и namespace-ов, проблем с утечкой (и я не об освобождении списка). У меня есть твердое представление о том что он пропагандирует, по его лекциям, статьям и книгам, поэтому я до сих пор уверен, в тех вещах о которых говорю. Вы можете почитать о них во всех источниках которые я приводил в этой теме. Кроме того вы к ним придете в следующей главе. Виноват отчасти бессмысленная критика, дань моему ЧСВ и желанию поспорить. Я ошибся в двух вещах, я был уверен что Страуструп не будет добавлять конструктор с аргументами в си-стайл список меняя POD тип, и в том что он не будет располагать поле данных первым. Возможно он вольно обошелся с учебным примером. Эталоном си-стайл динамических списков являются klist.h из FreeBSD, можете об этом почитать. А вы самостоятельно вдумываетесь в то что вам пишут? Попунктно. (не думая: "мало ли что он там пишет, в книжке же почти как у меня"). Вопрос совсем не риторический. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 21:03 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
sherzod_Насчет использования исключений в си-стайл списке я уже собрался было написать ему гневное письмо, По прежнему невнимательно читаете. Каждая глава книги посвящена детальному рассмотрению отдельной темы. Дабы сократить объёмы кода, автор некоторые вещи, не относящиеся к тематике данной главы, обозначает упрощённо. Однако в предыдущих главах им было уделено особое внимание. Я стараюсь следовать советам, которые даёт Стровструп, так что да, я вдумываюсь в том, что мне пишут. Советы указанного автора у меня в приоритете (по вполне понятным причинам). Вы же даёте мне советы, основываясь на неполной информации. В выполняемых примерах кое-что так же делаю упрощённо, сконцентрировавшись на основной теме упражнения и не углубляясь в дебри реализации, не относящиеся к данному, конкретному заданию. egorychЯ думаю, начнётся глава 18, и Compositum будет свой С-костыль переделывать в С++, и спрашивать у нас, как там теперь чего )) не бегите впереди паровоза. У меня складывается устойчивое впечатление, что на форуме много "бывалых" (как они себя пытаются позиционировать) советчиков-теоретиков. Я в таких попытках смысла не вижу. Что касается "Compositum", то он хотя бы читает и не стесняется спрашивать, если чего упускает из виду. Если я что-то утверждаю, то всегда могу указать источник, откуда это взял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 21:26 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
sherzod_и в том что он не будет располагать поле данных первым А что в этом страшного? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 21:30 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
sherzod_неужто Страуструп такому вот и учит, работать с си-стайл списком struct, через функции члены? И value он размещает в начале какой-бы то ни было структуры данных? А указатели на узлы после? Для вас это мелочи и вы между ними разницы не делаете? И функции не бросающие исключений у него никак не помечены, в новом или старом стандарте? И большого раздела нет, в котором он это подробно разъясняет? И детали реализации наружу выставляет? Покажите хотя бы одно место в какой либо его книге, где он в практическом примере контейнера (не для объяснения синтаксиса) использует конструктор для struct? И прямо так вот, с си-стайл списком он использует исключения? Полагаю, что ответы на свои вопросы вы уже увидели в коде обозначенной мною главы. sherzod_И функции не бросающие исключений у него никак не помечены, в новом или старом стандарте? Пока этой информации я не видел. И как они помечаются? В C++ классы, методы и свойства можно помечать различными атрибутами, но как это делается в C++ я пока не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 21:39 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
sherzod_мало ли что он там пишет, в книжке же почти как у меня Вы в моём коде обнаружили ошибку, которую я прозевал? Если "да" - буду признателен за указание оной (или оных). Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 21:43 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
CompositumВ C++ классы, методы и свойства можно помечать различными атрибутами, очепятка, я имел в виду C#. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 21:45 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
Compositum, Видимо я действительно слишком серьезно отнесся к учебному коду. Урок получен, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2013, 22:44 |
|
||
|
Двусторонний список: некорректное удаление элемента
|
|||
|---|---|---|---|
|
#18+
MasterZivThrow specification уже отменили, забанили навсегда... Можно поподробней? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 08:49 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38308640&tid=2020125]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
174ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 287ms |
| total: | 565ms |

| 0 / 0 |
