Что означает «[ptr, ptr + len) должен быть допустимым диапазоном»? - PullRequest
0 голосов
/ 21 мая 2018

В различных местах в стандарте c ++ фраза:

Требуется: [p, p + len) - допустимый диапазон.

(где p - указатель, иlen - это число).

Альтернативная версия для итераторов:

Требуется: [first, last) - допустимый диапазон.

Что это значит?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Я думаю, что соответствующая часть C++17 стандарта здесь

27.2.1 В общем [ iterator.requirements.general ]

...

8 Итератор j называется достижимым от итератораi тогда и только тогда, когда существует конечная последовательность применений выражения ++i, которая составляет i == j.Если j равно достижимо из i, они относятся к элементам той же последовательности.

9 Большая часть алгоритмической библиотекишаблоны, которые работают со структурами данных, имеют интерфейсы, которые используют диапазоны.Диапазон - это пара итераторов, которые обозначают начало и конец вычисления.Диапазон [i, i) - пустой диапазон;как правило, диапазон [i, j) относится к элементам в структуре данных, начиная с элемента, на который указывает i, и вплоть до, но не включая элемент, на который указывает j.Диапазон [i, j) действителен тогда и только тогда, когда j достижим с i.Результат применения функций в библиотеке к недопустимым диапазонам не определен.

Итак, извлечение соответствующих частей:

8 Итератор j называется достижимым от итератора i тогда и только тогда, когда существует конечная последовательность применений выражения ++i, которая составляет i == j ...

9 ... Диапазон [i, j) действителен тогда и только тогда, когда j достижим из i ....

Так что кажется, что«допустимый диапазон» - это пара итераторов , которые принадлежат к тому же контейнеру (или массиву), причем j находится дальше, чем i.

Но также не забывайте:

в целом, диапазон [i, j) относится к элементам в структуре данных, начиная с элемента, на который указывает i, и вплоть до, но не включая, указанного элементак j.

Таким образом, все итераторы между i и j (но не обязательновключая j) должно быть "в структуре данных" (т.е.не за пределами) .

0 голосов
/ 21 мая 2018

Это означает, что все между first включительно и p+len или last исключительно должно быть действительным.

Это все зависит оттот факт, что C ++ допускает существование указателей конца-в-конце массивов, при условии, что вы используете их только для ссылки на «конец» массива без разыменования их.

Итак, если у меня есть:

int my_array[10];

int* first = &my_array[0];
int* last = &my_array[10];

Тогда first и last представляют допустимый диапазон, даже если last технически указывает на нигде не действительный.

Тот же принцип применяется к итераторам, где end()контейнера вообще не является частью данных контейнера вообще.

На первый взгляд все это может выглядеть довольно странно, но этот способ представления диапазонов позволяет иметь дело с пустыми диапазонами в здравом смысле.

...