std::list<>::splice делает недействительными итераторы. Обоснование?
Интересно, в чем причина создания std::list<>::splice
сделать недействительными итераторы, которые ссылаются на подпоследовательность, вставляемую в новый контейнер. Это выглядит немного нелогично для меня, особенно в свете стандартных std::container::swap
Спецификация. В соответствии со стандартом языка std::container::swap
не делает недействительными никакие итераторы. Это совершенно разумная практическая спецификация. Однако я бы сказал, что std::list<>::splice
также очень выиграл бы от сохраняющего итераторы поведения.
Я понимаю, что могут быть некоторые чисто академические соображения, основанные на понятиях достижимости итераторов и т. Д. Но в то же время splice
это std::list
-специфическая операция, означающая, что предоставление специализированной спецификации для нее, вероятно, не нанесет серьезного концептуального ущерба конструкции STL в целом.
Так что это было? Будет ли это вне закона или слишком усложнять некоторые практические реализации std::list
что я не могу распознать?
2 ответа
В С ++11 splice
не делает недействительными итераторы, но заставляет их ссылаться на соответствующие элементы в *this
контейнер. Все это описано в 23.3.5.5.
Если контейнеры имеют настроенные, неравные (несовместимые) распределители, вы не можете менять указатели, у вас нет другого выбора, кроме как по-настоящему копировать элементы вокруг.