Сравнение итераторов из разных контейнеров: поучительная история
В C итераторы предоставляют мощный механизм для обхода коллекций. Однако важно помнить об ограничениях при использовании итераторов из разных контейнеров.
Часто возникает вопрос о том, законно ли сравнивать итераторы из разных контейнеров. Рассмотрим следующий пример:
std::vector foo;
std::vector bar;
std::cout На первый взгляд это выражение может показаться безобидным, но на самом деле оно приводит к неопределенному поведению. Согласно стандарту C11, итераторы можно сравнивать только в том случае, если они относятся к элементам одной и той же последовательности. Поскольку foo и bar представляют собой два разных вектора, их итераторы несопоставимы.
Это поведение дополнительно подчеркивается в выпуске LWG № 446:
"Результат прямого или косвенного вычисления любой функции сравнения или бинарный оператор - с двумя значениями итератора в качестве аргументов, которые были получены из двух разных диапазонов r1 и r2 (...), которые не являются поддиапазонами одного общего диапазона, не определен, если не указано явно в противном случае."
Это ограничение имеет серьезные последствия для реализации пользовательских итераторов. Если вы планируете реализовать оператор == для своего собственного итератора, вы должны убедиться, что он сравнивает только те итераторы, которые находятся в одном и том же диапазоне.
Несоблюдение этого правила может привести к неожиданному поведению и в конечном итоге нанести вред. к надежности вашего кода. Поэтому крайне важно помнить, что сравнение итераторов из разных контейнеров строго запрещено в C .
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3