|
19 / 19 / 18
Регистрация: 25.08.2014
Сообщений: 186
|
|
Написать свою реализацию deque27.10.2014, 16:07. Показов 14956. Ответов 41
Метки нет (Все метки)
Всем привет, требуется написать свою реализацию deque.
Я до этого никогда не сталкивался с распределением памяти, аллокаторами и другими вещами, которые в этом деле, по-видимому, придется заюзать. Расскажите, куда копать? Самая проблема с памятью, сам класс-то не очень сложный, почти что обычный массив.
0
|
|
| 27.10.2014, 16:07 | |
|
Ответы с готовыми решениями:
41
Написать свою реализацию функций нахождения косинуса и синуса Написать программу использующую пользовательские классы Stack, Queue, Deque
|
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
||
| 28.10.2014, 12:29 | ||
|
0
|
||
|
19 / 19 / 18
Регистрация: 25.08.2014
Сообщений: 186
|
|||||||||||
| 28.10.2014, 22:59 [ТС] | |||||||||||
|
Попытался разобраться с памятью, решил для начала сделать обычный массив.
Постепенно мне казалось что начинаю вникать, но в итоге я ничего не понял. iter_begin и iter_end возвращают какой-то свой внутренний виртуальный адрес, и я не могу понять почему, а при попытке доступа к *iter_begin и *iter_end прога падает. Объясните, пожалуйста.
Да, так же не понял, почему не получается в конструкторе сделать так:
0
|
|||||||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
|
||
| 28.10.2014, 23:22 | ||
|
Wiiiiijjj, память, на которую потенциально могли бы указывать твои iter_begin и iter_end, не была тобой выделена нигде. Вот и падает.
0
|
||
|
19 / 19 / 18
Регистрация: 25.08.2014
Сообщений: 186
|
|||||||||||
| 29.10.2014, 00:56 [ТС] | |||||||||||
|
Наверное, я чего-то фундаментального не понимаю, опять не робит
![]()
Добавлено через 19 минут Кликните здесь для просмотра всего текста
Не по теме: pastebin .com/JaTPtLf2
0
|
|||||||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
|
|||||||
| 29.10.2014, 08:29 | |||||||
|
А у тебя сейчас создаются два независимх единичных объекта типа T, и между указателями на них нельзя производить адресную арифметику - это разная память. Добавлено через 5 минут Вот примерно это я имею в виду:
1
|
|||||||
|
19 / 19 / 18
Регистрация: 25.08.2014
Сообщений: 186
|
||||||
| 29.10.2014, 13:07 [ТС] | ||||||
|
Сейчас будет очень много глупых вопросов, как и всегда. Я запутался (как и всегда).
2. warning: 'MyPersonalArrayType<char>::iter_end' will be initialized after [-Wreorder] Что значит это предупреждение? Ведь таким же способом я инициализирую и ::iter_begin, почему он на это так не ругается? 3. Как сделать корректное освобождение памяти? Опять же, когда размер не увеличивается в будущем, то удаляется вроде корректно, без утечек — delete []iter_begin; delete iter_end; — я же правильно понимаю? Как тогда сделать правильно с resize()? 4. Как вставляются и удаляются элементы?
0
|
||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
|
||||
| 29.10.2014, 13:29 | ||||
|
Остальное потом посмотрю - некогда. Ну или может еще кто ответит.
1
|
||||
|
19 / 19 / 18
Регистрация: 25.08.2014
Сообщений: 186
|
|||||||||||
| 30.10.2014, 12:21 [ТС] | |||||||||||
|
Падало почему-то как раз когда новый размер меньше старого. Т.е. вот при таком мейне не падает:
Вроде логика есть — создать новые два пойнтера, записать прошлый массив, потом новую часть заполнить нулями, удалить старые и присвоить им эти. Проблема в реализации? Буду сейчас дебажить.
Объясните в чем ошибка, не могу понять
0
|
|||||||||||
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
||||||
| 30.10.2014, 12:26 | ||||||
1
|
||||||
|
19 / 19 / 18
Регистрация: 25.08.2014
Сообщений: 186
|
|
| 30.10.2014, 12:43 [ТС] | |
|
Как же в деке реализовать добавление/удаление в начало?
Не перезаписывать же все элементы каждый раз.
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
|
||
| 30.10.2014, 13:41 | ||
|
В случае массива, да, перезаписывать каждый раз. Именно поэтому в std::vector нет функции push_front.
1
|
||
|
19 / 19 / 18
Регистрация: 25.08.2014
Сообщений: 186
|
|
| 30.10.2014, 14:10 [ТС] | |
|
DrOffset, да, массив, но это просто чтобы вникнуть хоть чуть-чуть в работу с памятью, в итоге мне необходимо сделать дек.
Как же реализуется дек? Гугл не помогает, там только примеры работы с обычным из библиотеки шаблонов. В стандартной же реализации столько шаманства, что вообще не получается вникнуть. Объясните принцип, по которому это делается, я попытаюсь отдельно все по пунктам навелосипедить, хоть как-нибудь, время поджимает, а результата null.
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
|
||
| 30.10.2014, 14:31 | ||
|
Предлагаю начать с реализации связного списка. Потом эту реализацию можно модифицировать, чтобы получился дек.
1
|
||
|
19 / 19 / 18
Регистрация: 25.08.2014
Сообщений: 186
|
||||||
| 30.10.2014, 17:58 [ТС] | ||||||
|
DrOffset, нашел много полезного материала про связные списки, помогло понять.
Но опять как всегда, валится на любом из методов.
0
|
||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
|
|||||||
| 30.10.2014, 18:28 | |||||||
1
|
|||||||
|
19 / 19 / 18
Регистрация: 25.08.2014
Сообщений: 186
|
||||||
| 30.10.2014, 18:55 [ТС] | ||||||
|
DrOffset, почему-то теперь вылетает при связи элементов, добавленных в конец, и в начало
![]()
0
|
||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
|
|
| 30.10.2014, 19:02 | |
Сообщение было отмечено Wiiiiijjj как решение
Решение
Wiiiiijjj, потому что в методе push_back поле first надо тоже назначать. Если элементов не было, то first будет указывать на только что созданный элемент, если элементы уже есть, то first не трогаем. В push_front - наоборот, last меняется, только если до этого не было элементов, в остальных случаях меняется first.
1
|
|
|
19 / 19 / 18
Регистрация: 25.08.2014
Сообщений: 186
|
|||||||||||
| 30.10.2014, 21:59 [ТС] | |||||||||||
|
DrOffset, а если, например, элементов не было, мы пушнули в конец что-то и first на это указывает, то что хранится в значении first?
Добавлено через 43 минуты Просто не понимаю, как избежать двойственности: добавляю в пустой дек один элемент, а получается два.
UPD: Разобрался с этим.
DrOffset, большое спасибо за проявленное терпение и помощь
0
|
|||||||||||
|
|
|
| 24.09.2016, 21:40 | |
|
На самом деле std::deque представляет из себя массив указателей на мини-массивы из 1...16 хранимых элементов.
Для std::deque<int> это будет массив указателей на мини-массив из 4-х целых чисел. Для std::deque<char> это будет массив указателей на мини-массив из 16-и символов. Т.е. количество вмещаемых элементов в такие мини-массивы равно 16 / sizeof(value_type). Дальше буду опираться только на std::deque<int>, а массив указателей на мини-массив будет просто map. При вставке первого элемента, выделяется память под массив из 8 указателей (map[8][4]). Вместимость контейнера при этом будет под 32 элемента типа int. При вставке int в конец контейнера методом push_back в самой map этот int будет записан в самое её начало (map[0][0]), а при вставке в начало контейнера - в самый её конец (map[7][3]) При следующей вставке методом push_back, int будет записан в map[0][1], а при вставке методом push_front в map[7][2] и т.д. Вставка будет без проблем продолжаться, пока индексы указателей, соответствующие методам push_back и push_front не столкнутся т.е. пока не произойдёт map[idx push_front][] == map[idx push_back][]. В этом случае будет заново выделен массив ЧИСТО под указатели, но в двойном размере, т.е. map[16][4] (в следующий раз map[32][4] и т.д.). Значения указателей прошлого массива будут записаны в новый, но при этом значения тех указателей, которые использовались методом push_front будут записаны в самый конец нового массива. Далее несложно догадаться, как реализован operator[]: контейнер должен хранить значение количества элементов, вставленных методом push_front, а также общее количество элементов для того, чтобы правильно вычислить индексы при вытаскивании значения из map. Метод insert не смотрел, но думаю, что сначала определяется, между какими элементами вставляется новый элемент - между push_back-элементами или push_front-элементами, и затем происходит перестановка либо одних, либо других.
0
|
|
|
Любитель чаепитий
|
|
| 25.09.2016, 00:05 | |
|
0
|
|
| 25.09.2016, 00:05 | |
|
Помогаю со студенческими работами здесь
40
Написать реализацию перегрузки функции Написать реализацию перегруженных функций Написать собственную реализацию стандартной функции strstr Подскажите пожалуйста как написать реализацию алгоритма Написать собственную реализацию функции strcmp() согласно условию Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
|
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
|
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика
Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
|
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации:
В классе Работник добавить:
накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни
коэффициентПрезентеизма — снижает продуктивность. . .
|
|
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день.
Для работы необходим браузер,. . .
|
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности
Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано.
. . .
|
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
|
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива
Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
|