2016-09-05 3 views
-1

С первого взгляда двойной связанный список кажется разумным, но по мере того, как я начал внедрять, я столкнулся с проблемой отслеживания текущей позиции. Я использовал std :: list iterator, но работа с крайними случаями (см. Следующую часть) стала болью. Так вот требование к DS:Структура данных для медиа-плейлиста?

  • сохранить порядок элементов
  • Эффективного введения в середине
  • Вставка/стирает не отменяют итераторы
  • O (N) произвольный доступ не является проблема

Соединительный список подходит для этого.

Требование к текущей позиции курсора (итератор):

  • Двунаправленного
  • Изначально обозначает end положения
  • При итераторе в end положения, после вставки элемента в конце концов, в следующем итераторе вперед будет двигаться это к этому элементу. Такое же поведение, если ранее список воспроизведения был пуст
  • же в противоположном случае: итератор в начале, push_front, двигаясь в обратном направлении будет идти вновь добавленный элемент

Каковы лучшие практики по его реализации? Есть ли для него библиотеки (C++)?

+1

std :: list звучит идеально. в чем проблема? –

ответ

1

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

Добавление, удаление и перемещение элементов в списке или в нескольких списках не отменяет итераторов или ссылок. Итератор недействителен только при удалении соответствующего элемента.

С моей точки зрения std::list идеально подходит для описанной вами проблемы.

+0

Глупый я: есть структура, состоящая из std :: list и std :: list :: iterator. Копирр по умолчанию сделал глубокую копию списка, но итератор все еще указывал на старый. –

Смежные вопросы