Второе ограничение заключается в том, что при предоставлении количества элементов без исходного значения необходимо использовать
vector
Здесь число 10 используется для указания на то, как создать вектор, — необходимо, чтобы он обладал десятью элементами с инициализированными значениями. Число 10 не "копируется" в вектор. Следовательно, нельзя использовать форму инициализации копией. Более подробная информация об этом ограничении приведена в разделе 7.5.4.
В некоторых случаях смысл инициализации зависит от того, используются ли при передаче инициализаторов фигурные скобки или круглые. Например, при инициализации вектора vector
одиночным целочисленным значением это значение могло бы означать либо размер вектора, либо значение элемента. Точно так же, если предоставить два целочисленных значения, то они могли бы быть размером и исходным значением или значениями для двух элементов вектора. Для определения предназначения используются фигурные или круглые скобки.
vector
vector
vector
vector
Круглые скобки позволяют сообщить, что предоставленные значения должны использоваться для создания объекта. Таким образом, векторы v1
и v3
используют свои инициализаторы для определения размера вектора, а также размера и значения его элементов соответственно.
Использование фигурных скобок, {...}
, означает попытку списочной инициализации. Таким образом, если класс способен использовать значения в фигурных скобках как список инициализаторов элементов, то он так и сделает. Если это невозможно, то следует рассмотреть другие способы инициализации объектов. Значения, предоставленные при инициализации векторов v2
и v4
, рассматриваются как значения элементов. Это списочная инициализация объектов; у полученных векторов будет один и два элемента соответственно.
С другой стороны, если используются фигурные скобки и нет никакой возможности использовать инициализаторы для списочной инициализации объектов, то эти значения будут использоваться для создания объектов. Например, для списочной инициализации вектора строк следует предоставлять значения, которые можно рассматривать как строки. В данном случае нет никаких сомнений, осуществляется ли списочная инициализация элементов или создание вектора указанного размера.
vector
//
vector
//
vector
//
vector
//
Хотя фигурные скобки использованы во всех этих определениях, кроме одного, только вектор v5
имеет списочную инициализацию. Для списочной инициализации вектора значения в фигурных скобках должны соответствовать типу элемента. Нельзя использовать объект типа int
для инициализации строки, поэтому инициализаторы векторов v1
и v8
не могут быть инициализаторами элементов. Если списочная инициализация невозможна, компилятор ищет другие способы инициализации объектов.
Упражнение 3.12. Есть ли ошибки в следующих определениях векторов?
Объясните, что делают допустимые определения. Объясните, почему некорректны недопустимые определения.
(a) vector
(b) vector
(c) vector
Упражнение 3.13. Сколько элементов находится в каждом из следующих векторов? Каковы значения этих элементов?
(a) vector
(с) vector
(e) vector
(g) vector