Что такое наполовину открытый диапазон и вне конечного значения

Что означают эти термины в C ++?

1. от end значение

2. полуоткрытый диапазон — [begin, off_the_end)

Я сталкивался с ними, читая о петлях.

16

Решение

Полуоткрытый диапазон — это тот, который включает первый элемент, но исключает последний.

Диапазон [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)

26

Другие решения

Это не специфичные для C ++ термины, это общие математические термины.

[] и () обозначают, является ли диапазон включающим / исключающим конечную точку:

  • [включает в себя конечную точку
  • (исключая конечную точку
  • [] = ‘Закрыто’, включает обе конечные точки
  • () = ‘Открыть’, исключая обе конечные точки
  • [] и (] оба являются «полуоткрытыми» и включают только одну конечную точку

Большинство циклов for C ++ покрывают полуоткрытый диапазон (вы включаете первый элемент: например, for int i=0;, но исключите последний элемент: i < fooне i ≤ foo)

17

Как объяснено в других ответах, полуоткрытый диапазон также математический термин и использование этого термина в контекст программирования, подразумевается, что отправной точкой является включены и конечная точка не входит.

Что это на самом деле означает в контексте программирования на 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 ++.

1
По вопросам рекламы [email protected]