![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Заблокирован
Регистрация: 06.02.2011
Сообщений: 1,999
|
![]()
Добрый день !
Подскажите почему не работает этот кусок ? Код:
Последний раз редактировалось RAFA91; 09.01.2016 в 17:56. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
потому что нет конструктора по умолчанию.
http://www.cplusplus.com/reference/list/list/resize/ для связанного списка операция резервирования не имеет смысла ИМХО. ибо вы забьёте список пустыми значениями(от конструктора по умолчанию), а не резерв некий(да и тогда по-моему лучше вектор уж) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#3 |
Заблокирован
Регистрация: 06.02.2011
Сообщений: 1,999
|
![]()
просто столкнулся с такой проблемой.
нужно отсортировать список по кускам. алгоритм сортировки не тянет итераторы списка. поэтому пришлось создать вектор Код:
Код:
Код:
Код:
Последний раз редактировалось RAFA91; 09.01.2016 в 18:13. |
![]() |
![]() |
![]() |
#4 |
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
![]()
А зачем что-то резервировать? В copy можно запихнуть back_inserter.
Как уже написал(на другом форуме), можно соорудить адаптер. Причем можно соорудить адаптер как для итераторов списка, так и для значений, находящихся в списке (например, если копирование в вектор будет неимоверно дорогим). Ну и можно, например, использовать splice: Код:
Вот, вынес всё что нужно в отдельную функцию: Код:
Последний раз редактировалось Croessmah; 09.01.2016 в 19:12. |
![]() |
![]() |
![]() |
#5 |
Заблокирован
Регистрация: 06.02.2011
Сообщений: 1,999
|
![]()
рад что Вы присутствуете и на этом форуме ))).
адаптер это конечно хорошо только почему бы не воспользоваться другим контейнером ? |
![]() |
![]() |
![]() |
#6 | ||
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
![]() Цитата:
сортировка этого контейнера (если это вектор, то соответственно будет копирование элементов) + копирование сортированного куска снова в список + удаление не сортированных старых данных из списка. Прикиньте, какой это удар по производительности. Частично потери производительности на больших контейнерах можно избежать используя всякие прокси-классы, но всё же это будет медленно. Все эти вопросы решаются splice'ом, который я показал. Из одного списка данные просто вырезаются (там же тупо переставить указатели), далее сортировка временного списка (опять же перестановкой указателей), затем сращиваем сортированный список со старым (и снова тупо указатели поменять). А теперь представьте себе разницу в производительности этих двух способов, если один элемент в списке, допустим, занимает несколько сотен килобайт и копирование его очень дорого обходится. splice будет в выигрыше практически в любом случае. А если контейнер очень большой и кусок для сортировки большой и данные громоздки, то выигрыш просто огромный. Цитата:
![]() |
||
![]() |
![]() |
![]() |
#7 | |
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
![]()
Для примера немного переделал код.
Теперь у нас не int'ы, а некая структура, которая будет вести лог по созданию элементов: Код:
итак, алгоритм с копированием в вектор: Код:
Нас интересует только часть вывода между start algorithm и end algorithm Видите сколько там всяких копирований происходит? (конечно, это тоже можно оптимизировать, но не настолько, чтобы противопоставить splice'ам). Вот код со splice'ами: Код:
И что мы видим? Да просто Цитата:
То есть копирований самих данных нет вообще! Всё решается перестановкой указателей в самих списках. |
|
![]() |
![]() |
![]() |
#8 |
Заблокирован
Регистрация: 06.02.2011
Сообщений: 1,999
|
![]()
Croessmah благодарю Вас за этот пример. на досуге попытаюсь его прочесть.
то что касается производительности : мы же не в каменном веке где частота 1 мега. теперь думаю не стоит жалеть память. |
![]() |
![]() |
![]() |
#9 |
Заблокирован
Регистрация: 06.02.2011
Сообщений: 1,999
|
![]()
функция
Код:
Код:
|
![]() |
![]() |
![]() |
#10 | ||
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
![]() Цитата:
Зависит от типа итератора. Для bidirectional итератора - будет использован operator++ для "перемещения на n позиций" (ну или operator--, в зависимости от того, куда двигаем). Для random-access итератора - будет использован один operator+ (ну или operator-, в зависимости от того, куда двигаем). Ваш цикл не верен. У advance есть только итератор и кол-во позиций, на которые двигаем. Доступа к самому списку у него нет, так что mylist1.end() не прокатит. Цитата:
Поэтому их тормознутое УГ на помойке софта валяется. |
||
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Отключить резервирование места в IdHTTP | kangreon | Работа с сетью в Delphi | 3 | 21.03.2018 11:02 |
Blowfish (резервирование дополнительного байта для блока, говорящий о длине блока) | ITdocer | Общие вопросы C/C++ | 0 | 21.05.2014 15:40 |
Очистка списка имен UserForm из памяти | iNataliya | Microsoft Office Excel | 4 | 30.08.2013 00:21 |
Удаление связного списка из памяти | Mahin | Общие вопросы C/C++ | 3 | 13.07.2012 10:10 |
Программа для тестирования памяти, тестирование ячеек памяти | Hunter557 | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 0 | 30.01.2011 19:20 |