На сколько корректна следующая запись:
std::set<int> associative_container{ 1, 2, 3, 4 };
int back_value{ *std::prev(std::end(associative_container)) };
Стандарт дает какие то гарантии, что декремент end-итератора будет указывать на последний элемент ассоциативного контейнера?
Или это все же UB?
Здравствуйте, _niko_, Вы писали:
__>На сколько корректна следующая запись:
__>__>std::set<int> associative_container{ 1, 2, 3, 4 };
__>int back_value{ *std::prev(std::end(associative_container)) };
__>
__>Стандарт дает какие то гарантии, что декремент end-итератора будет указывать на последний элемент ассоциативного контейнера?
__>Или это все же UB?
https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator
Это не стандарт, конечно, но доверять этому ресурсу можно, имхо:
Notes
The begin iterator is not decrementable and the behavior is undefined if --container.begin() is evaluated. A bidirectional iterator does not have to be dereferenceable to be decrementable (in particular, the end iterator is not dereferenceable but is decrementable)
Само собой, для пустого контейнера, декремент от end приведет к UB, ибо end равен begin.
Здравствуйте, _niko_, Вы писали:
__>На сколько корректна следующая запись:
__>__>std::set<int> associative_container{ 1, 2, 3, 4 };
__>int back_value{ *std::prev(std::end(associative_container)) };
__>
__>Стандарт дает какие то гарантии, что декремент end-итератора будет указывать на последний элемент ассоциативного контейнера?
... если контейнер не пуст.
Даёт. Итераторы ассоциативного контейнера -- это bidirectional итераторы. Дальше смотри свойства этого класса итераторов.
Здравствуйте, _niko_, Вы писали:
__>На сколько корректна следующая запись:
Корректна
__>__>std::set<int> associative_container{ 1, 2, 3, 4 };
__>int back_value{ *std::prev(std::end(associative_container)) };
__>
лучше это используй std::rbegin(v), но учти, он может быть std::rend()
__>Стандарт дает какие то гарантии, что декремент end-итератора будет указывать на последний элемент ассоциативного контейнера?
если декремент применим, то всё бует норм.
__>Или это все же UB?
нет