Сортировка пользовательского связанного списка с помощью <алгоритма> сортировки

0

Я написал собственный список, связанный дважды, в комплекте с итераторами begin() и end(). Они отлично работают с перемещением списка с использованием цикла. Однако, как часть моего задания, мне нужно отсортировать список в соответствии с определенными критериями. Поскольку мы еще не рассмотрели главу алгоритмов сортировки, нам разрешено использовать функцию сортировки, определенную в заголовке. Но sort (list.begin(), list.end(), compare) возвращает довольно много ошибок, связанных с моим классом итератора:

error: no type named iterator_category
error: no type named value_type
error: no type named difference_type
error: no type named pointer
error: no type named reference

Кроме того, я получаю ошибки в отношении операторов + и -. Я понимаю, как определить value_type, указатель и ссылку, но я теряюсь, когда дело касается других. Это то, что я пытаюсь сделать возможным? Благодарю!

Теги:
list
algorithm
sorting
linked-list

1 ответ

1
Лучший ответ

Это возможно, но может быть несколько болезненным, так как вы в конечном итоге напишите достаточно количество шаблонов.

Хуже того, когда вы закончите, это не сработает очень хорошо - std::sort не требует абсолютно итераторов произвольного доступа, но с (скажем) двунаправленными итераторами производительность обычно будет довольно низкой. Например, это достаточно плохо, что (в отличие от большинства стандартных контейнеров). std::list имеет функцию sort чтобы компенсировать тот факт, что std::sort плохо работает в связанных списках.

В основном, operator+ и operator- просто продвигают указатель N элементов вперед или назад. обычно вы перегружаете operator++ для продвижения на один, что-то вроде pos = pos → next;operator-- использует что-то вроде pos = pos->prev;. Затем вы можете использовать std::advance или std::next для продвижения более чем по одному элементу за раз (но помните: для двунаправленного итератора он будет делать это, вызывая ++ или -- неоднократно - одну из причин низкой производительности).

  • 0
    Так что, наверное, лучше всего написать собственный алгоритм сортировки, ха-ха?
  • 0
    @RobRob: К сожалению, да. Еще лучше: просто избегайте связанных списков, где они редко бывают полезными.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню