Что означают эти термины в C ++?
1.
от end
значение
2.
полуоткрытый диапазон — [begin, off_the_end)
Я сталкивался с ними, читая о петлях.
Полуоткрытый диапазон — это тот, который включает первый элемент, но исключает последний.
Диапазон [1,5) полуоткрыт и состоит из значений 1, 2, 3 и 4.
«вне конца» или «после конца» относится к элементу просто после конец последовательности, и особенный в том, что итераторам разрешено указывать на него (но вы можете не смотреть на фактическое значение, потому что оно не существует)
Например, в следующем коде:
char arr[] = {'a', 'b', 'c', 'd'};
char* first = arr
char* last = arr + 4;
first
теперь указывает на первый элемент массива, а last
точки один за концом массива. Нам разрешено точка один за концом массива (но не два в прошлом), но мы не можем пытаться получить доступ к элементу в этой позиции:
// legal, because first points to a member of the array
char firstChar = *first;
// illegal because last points *past* the end of the array
char lastChar = *last;
Наши два указателя, first
а также last
вместе определяют диапазон всех элементов между ними.
Если это наполовину открытый диапазон, то он содержит элемент, на который указывает first
и все элементы между ними, но не элемент, на который указывает last
(что хорошо, потому что на самом деле он не указывает на действительный элемент)
В C ++ все стандартные библиотечные алгоритмы работают на таких полуоткрытых диапазонах. Например, если я хочу скопировать весь массив в другое место dest
, Я сделаю это:
std::copy(first, last, dest)
Простой цикл for обычно следует похожему шаблону:
for (int i = 0; i < 4; ++i) {
// do something with arr[i]
}
Этот цикл идет от 0 до 4, но он исключает конечное значение, поэтому диапазон охватываемых индексов полуоткрытый, конкретно [0, 4)
Это не специфичные для C ++ термины, это общие математические термины.
[] и () обозначают, является ли диапазон включающим / исключающим конечную точку:Большинство циклов for C ++ покрывают полуоткрытый диапазон (вы включаете первый элемент: например, for int i=0;
, но исключите последний элемент: i < foo
не i ≤ foo
)
Как объяснено в других ответах, полуоткрытый диапазон также математический термин и использование этого термина в контекст программирования, подразумевается, что отправной точкой является включены и конечная точка не входит.
Что это на самом деле означает в контексте программирования на C / C ++? Допустим, вы собираетесь печатать элементы целочисленного массива. Говоря о языке C, потому что у вас нет никаких знаний во время выполнения для размера массива, у вас есть два варианта. Либо вы должны указать размер массива, поэтому сигнатура функции будет такой, как показано ниже;
void printArray(int * array, int size);
или вы должны использовать полуоткрытый диапазон, Это означает, что вы должны предоставить как начальный, так и конечный указатель (и функция будет обрабатывать, включая начало, исключая конец) в дополнение к самому массиву. И подпись функции будет как ниже;
void printArray(int * array, int * begin, int * end);
Чтобы проиллюстрировать это, вот пример для предоставления размера массива;
#include <stdio.h>
void printArray(int * array, int size)
{
printf("Array: ");
for(int i = 0; i < size; i++)
printf("%2d ", array[i]);
printf("\n");
}
int main()
{
int array[5] = { 1, 2, 3, 4, 5 };
printArray(array, 5);
return 0;
}
В приведенном выше примере мы передали два параметра printArray
Функция, как это очевидно по сигнатуре функции, указателю на первый элемент массива (или самому массиву) и размеру массива.
Однако, как я уже писал выше, мы также можем использовать диапазон полуоткрытия в сигнатуре функции, который можно увидеть, как показано ниже;
#include <stdio.h>
void printArray(int * array, int * begin, int * end)
{
printf("Array: ");
for(int * index = begin; index != end; index++)
printf("%2d ", *index);
printf("\n");
}
int main()
{
int array[5] = { 1, 2, 3, 4, 5 };
printArray(array, array, array+5);
return 0;
}
Оба кода будут выдавать один и тот же вывод, как показано ниже;
Array: 1 2 3 4 5
Как видите, printArray
функция печатает функцию для диапазона [begin, end)
, index
который на самом деле является указателем на элементы целочисленного массива, начинается с begin
и включает в себя begin
и цикл заканчивается, когда index
равно end
указатель, исключая для обработки end
, Это я назвал полуоткрытый диапазон.
Полуоткрытый диапазон это Соглашение C ++.