Подразумевает ли RandomAccessIterator, что данные непрерывны в памяти?

Другие типы итераторов, безусловно, не подразумевают, что они указывают на непрерывные данные, но мне интересно, могу ли я обращаться с RandomAccessIterators, как если бы они указывали на буфер непрерывных данных - то есть их можно было бы преобразовать в указатели на данные.

Это предположение верно? Могу ли я всегда безопасно использовать &*it и получить указатель не только на один элемент, но и на непрерывный буфер, если it такое RandomAccessIterator?

1 ответ

Решение

Нет, это неверное предположение. Сама стандартная библиотека имеет контрпример в std::deque:

из cppreference:

В отличие от std::vectorэлементы deque не сохраняются непрерывно: типичные реализации используют последовательность индивидуально распределенных массивов фиксированного размера.

std::deque"s iterator является RandomAccessIterator:

[deque.overview] / 1

Deque - это контейнер последовательности, который, подобно вектору ( [vector]), поддерживает итераторы произвольного доступа.

Если вам нужна гарантия непрерывной памяти, вам не нужно долго ждать: гарантия будет предоставлена ​​ContiguousIterator на C++ 17.1


концепция ContiguousIterator была предложена в серии документов, оканчивающихся на N4284, и принята в ноябре 2014 года

Другие вопросы по тегам