Подразумевает ли RandomAccessIterator, что данные непрерывны в памяти?
Другие типы итераторов, безусловно, не подразумевают, что они указывают на непрерывные данные, но мне интересно, могу ли я обращаться с RandomAccessIterators, как если бы они указывали на буфер непрерывных данных - то есть их можно было бы преобразовать в указатели на данные.
Это предположение верно? Могу ли я всегда безопасно использовать &*it
и получить указатель не только на один элемент, но и на непрерывный буфер, если it
такое RandomAccessIterator?
1 ответ
Нет, это неверное предположение. Сама стандартная библиотека имеет контрпример в std::deque
:
В отличие от
std::vector
элементы deque не сохраняются непрерывно: типичные реализации используют последовательность индивидуально распределенных массивов фиксированного размера.
std::deque
"s iterator
является RandomAccessIterator:
Deque - это контейнер последовательности, который, подобно вектору ( [vector]), поддерживает итераторы произвольного доступа.
Если вам нужна гарантия непрерывной памяти, вам не нужно долго ждать: гарантия будет предоставлена ContiguousIterator на C++ 17.1
концепция ContiguousIterator была предложена в серии документов, оканчивающихся на N4284, и принята в ноябре 2014 года