Скажем, у меня есть std::deque<int> d
, содержащий 100 значений, от 0
до 99
. Учитывая следующее:
В отличие от векторов, двухсторонние очереди не гарантируют, что все их элементы будут храниться в смежных местах хранения: доступ к элементам в двухсторонней очереди путем смещения указателя на другой элемент приводит к неопределенному поведению.
Кажется, строка ниже недействительна:
int invalidResult = *(d.begin() + 81); // might give me 81, but NOT GUARANTEED, right?
У меня такой вопрос: об этом позаботится итератор?
std::deque<int>::iterator it = d.begin();
int isThisValid = *(it + 81); // 81 every time? or does it result in undefined behavior?
В какой-то момент я думал, что итератор справится с любыми разрывами в базовом хранилище, но теперь я в этом не уверен. Очевидно, что если вы используете it++
81 раз, в результате *it
вы получите 81
.
Кто-то может сказать наверняка?
Что бы это ни стоило, я не использую С++ 11.
d.begin() + 81
? - person Kerrek SB   schedule 06.01.2017