cpp и sort2.cpp. Как показывает рисунок 1.1, дву­сторонняя очередь также обеспечивает произвольный доступ, в отличие от списка. Это объясняет, почему вызов

sort(v.begin(),   v.end());

встречающийся в программе sortl.cpp, будет работать, если мы в программе заменим всюду vector на deque, но не на list. Более подробно - см. раздел 1.9.

Инициализация контейнеров

Как известно каждому программисту на С(++), определение массива может содержать список начальных значений. Например, мы можем написать

int  a[3]   =   {10,   5,   7}; int b[]   =   {8,   13};

//  эквивалентно  int b[2]   =   {8,   13}; int c[3]   =   {4};

//  эквивалентно  int  с[3]   =   {4,   0,   0};

Инициализация также возможна и для трех других типов последователь­ных контейнеров, как показано в следующем примере:

int a[3] = {10, 5, 7}; vector<int> v(a, a+3); deque<int> w(a, a+3); list<int> x(a, a+3);

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

vector<int> vl (v.beginf) , v.endO);

вектор vl станет идентичен вектору v, оба будут состоять из трех элемен­тов типа int, 10, 5 и 7. Этот пример откомпилируется, поскольку v и vl от­носятся к одному типу - vector<int>. Напротив, следующий пример не бу­дет компилироваться, поскольку мы не можем использовать значения списках для инициализации вектора vl1:

vector<int> vl(x.begin(),   x.end());

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

В окончательном стандарте C++ нет этого ограничения, поэтому приведенный пример должен откомпилироваться без ошибок на более позднем компиляторе, но рассматриваемые автором компиляторы VC5 и ВС5 основываются на раннем ва­рианте стандарта языка, который не поддерживает версии STL, позволяющие ини­циализировать контейнер одного типа элементами контейнера другого типа (за исключением массива). - Прим. переводчика.

и необязательный параметр, задающий значение для элементов, содер­жащихся во вновь созданном контейнере. Например, мы можем написать

vector<int> v(5,   8)   //  Пять элементов,   все  они равны 8. или

vector<int> v(5);

В последнем случае вектор v будет содержать пять элементов. Эта форма записи удобна в том случае, когда мы хотим присвоить значения элемен­там позже, как в примере из раздела 1.6.


<< назад вперед >>