Упражнение 3.26. Почему в программе двоичного поиска использован код mid = beg + (end - beg) / 2;
, а не mid = (beg + end) / 2;
?
3.5. Массивы
vector
(см. раздел 3.3), но с другим соотношением между производительностью и гибкостью. Как и вектор, массив является контейнером безымянных объектов одинакового типа, к которым обращаются по позиции. В отличие от вектора, массивы имеют фиксированный размер; добавлять элементы к массиву нельзя. Поскольку размеры массивов постоянны, они иногда обеспечивают лучшую производительность во время выполнения приложений. Но это преимущество приобретается за счет потери гибкости.
3.5.1. Определение и инициализация встроенных массивов
Массив является составным типом (см. раздел 2.3). Оператор объявления массива имеет форму a[d]
, где а
— имя; d
— размерность определяемого массива. Размерность задает количество элементов массива, она должна быть больше нуля. Количество элементов — это часть типа массива, поэтому она должна быть известна на момент компиляции. Следовательно, размерность должна быть константным выражением (см. раздел 2.4.4).
unsigned cnt = 42; //
constexpr unsigned sz = 42; //
//
int arr[10]; //
int *parr[sz]; //
string bad[cnt]; //
string strs[get_size()]; //
//
По умолчанию элементы массива инициализируются значением по умолчанию (раздел 2.2.1).
При определении массива необходимо указать тип его элементов. Нельзя использовать спецификатор auto
для вывода типа из списка инициализаторов. Подобно вектору, массив содержит объекты. Таким образом, невозможен массив ссылок.
Массив допускает списочную инициализацию (см. раздел 3.3.1) элементов. В этом случае размерность можно опустить. Если размерность отсутствует, компилятор выводит ее из количества инициализаторов. Если размерность определена, количество инициализаторов не должно превышать ее.
Если размерность больше количества инициализаторов, то инициализаторы используются для первых элементов, а остальные инициализируются по умолчанию (см. раздел 3.3.1):
const unsigned sz = 3;
int ia1[sz] = {0, 1, 2}; //
//
int a2[] = {0, 1, 2}; //
int a3[5] = {0, 1, 2}; //
string a4[3] = {"hi", "bye"}; //
int a5[2] = {0, 1, 2}; //
У символьных массивов есть дополнительная форма инициализации: строковым литералом (см. раздел 2.1.3). Используя эту форму инициализации, следует помнить, что строковые литералы заканчиваются нулевым символом. Этот нулевой символ копируется в массив наряду с символами литерала.
char a1[] = {'C', '+', '+'}; //
//
char а2[] = {'C', '+', '+', '\0'}; //
//
char a3[] = "С++"; //
//
const char a4[6] = "Daniel"; //
//