У меня есть настраиваемая структура данных, к которой можно получить доступ несколькими способами. Я хочу попытаться сохранить эту структуру данных, чтобы она соответствовала стандартам STL, а также возможно. Поэтому у меня уже есть много typedefs, которые задают параметры шаблона STL-имена. Для меня это обычное дело.Как обрабатывать несколько типов итераторов
Однако я не уверен, как правильно добавить итераторы в свою структуру данных. Основная проблема, с которой я столкнулся, заключается в том, что в отношении структуры данных будет много политик итераций. Самый простой вариант использования - итерация по всем элементам, которые будут хорошо обрабатываться STL-Conforming iterators над файловой структурой. Однако также можно получить доступ к элементам, которые каким-то образом похожи на данный ключ. Я также хотел бы перебрать все эти подобные элементы таким образом, чтобы я мог взаимодействовать с STL.
Эти идеи я думал о до сих пор:
- Обеспечить только один тип итератора:
Это поясню, что std::map
делает. Итераторы запуска и завершения для поддиапазона представлены std::map::lower_bound()
и std::map::upper_bound()
.
Однако это хорошо работает, потому что итераторы, возвращаемые begin()
, end()
, lower_bound()
и upper_bound()
совместимы, то есть operator==()
может быть дано очень хорошо определенный смысл на них. В моем случае это было бы трудно получить, или даже было бы невозможно дать четкую семантику. Например, я, вероятно, получаю некоторые случаи, когда it1==it2
, но ++it1!=++it2
. Я не уверен, разрешено ли это STL.
- Обеспечить несколько типов итераторов:
Гораздо легче обеспечить чистую operator==()
семантику. С другой стороны, Nasty, потому что он увеличивает количество типов.
- Обеспечить один тип итератора и использование СТЛ :: алгоритмы для специализированного доступа
Я не уверен, если это вообще возможно. Итерационное состояние должно храниться итератором каким-то образом (прямо или в Memento). Использование этого подхода означало бы специализацию всех stl :: алгоритмов и доступ к предикату непосредственно в специализации. Скорее всего, невозможно, и, если возможно, очень плохая идея.
Прямо сейчас я в основном выбираю версию 1, т. Е. Для обеспечения только одного типа итератора. Однако, поскольку я не понимаю, как очистить семантику, я еще не решил.
Как вы справитесь?
Да, это было главным образом так, как я бы это сделал в этом случае. Другие итераторы в основном станут typedef для создания экземпляра шаблона. Возможно, это решение выглядит не так хорошо, потому что ни одна из STL-Collections не идет так (возможно, это просто не нужно). – LiKao
@LiKao: Стандартным контейнерам не нужен такой механизм, потому что они не поддерживают разные политики итераций. –