Я написал собственный список, связанный дважды, в комплекте с итераторами 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, указатель и ссылку, но я теряюсь, когда дело касается других. Это то, что я пытаюсь сделать возможным? Благодарю!
Это возможно, но может быть несколько болезненным, так как вы в конечном итоге напишите достаточно количество шаблонов.
Хуже того, когда вы закончите, это не сработает очень хорошо - std::sort
не требует абсолютно итераторов произвольного доступа, но с (скажем) двунаправленными итераторами производительность обычно будет довольно низкой. Например, это достаточно плохо, что (в отличие от большинства стандартных контейнеров). std::list
имеет функцию sort
чтобы компенсировать тот факт, что std::sort
плохо работает в связанных списках.
В основном, operator+
и operator-
просто продвигают указатель N элементов вперед или назад. обычно вы перегружаете operator++
для продвижения на один, что-то вроде pos = pos → next;
(и operator--
использует что-то вроде pos = pos->prev;
. Затем вы можете использовать std::advance
или std::next
для продвижения более чем по одному элементу за раз (но помните: для двунаправленного итератора он будет делать это, вызывая ++
или --
неоднократно - одну из причин низкой производительности).