C++ Программирование в среде С++ Builder 5

         

Векторы


Вектор — это своего рода массив с “интеллектом”, помнящий свой размер и поддерживающий свою целостность. Они, среди прочих контейнеров, отличаются эффективностью доступа к элементам. К недостаткам следует отнести сложность вставки элементов в середину вектора, поскольку при этом приходится перемещать часть его содержимого.

Создание векторов

Объявления векторов могут выглядеть примерно так:

#include <vector>

vector<int> vint;

vector<double> vdouble (100);

vector<string> vstr(10);

vector<MyClass> myvect(20);

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

vector<int> vint1(24, -1);

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

  • конструктор по умолчанию
  • конструктор копии
  • деструктор


  • операцию взятия адреса
  • операцию присваивания.
  • На самом деле для простых классов, не содержащих указателей на какие-либо динамические объекты, годятся те функции-элементы, что компилятор генерирует сам, за исключением разве что конструктора по умолчанию. (Он генерируется автоматически, только если вы не определили вообще никаких конструкторов. Создаваемые таким конструктором объекты будут содержать “мусор”.) Советую вам обязательно объявлять, хотя бы пустой, конструктор по умолчанию для классов, которые будут размещаться в контейнерах.

    Естественно, потребуются еще какие-то механизмы присваивания и извлечения значений элементов данных создаваемого объекта и т. п. Но это вопрос внешний по отношению к функционированию контейнера.

    Если вы хотите выполнять поиск или сортировку, потребуются операции равенства (==) и “меньше” (<).

    Скелет класса, пригодного для помещения в вектор, может иметь такой вид:

    class Coord {

    int x, у;

    public:

    Coord() : x(0), у(0) {}

    void set(int _x, int y) { x = x; у = _y; }

    void get(int &_x, int &_y) { _x = x, _y = y; ) };


    Для доступа к данным вектора применяется индексация:

    vstr[3] = "Third value: ";

    vdouble[10] = 3.3333333333;

    cout<< vstr[l]<< vdouble[10] << endl;

    Можно конструировать вектор с помощью итераторов, например:

    int iArr[16] ;

    vector<int> iVectl(iArr, iArr + 16);

    vector<int> iVect2(iVect!.begin(), iVect!.end());

    ( Для обычного массива, как мы уже говорили, итератором является простой указатель. Второй из векторов конструируется из первого спецификацией его начального и конечного итераторов.)



    Действия над векторами



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

    Размер и вместимость вектора можно получить с помощью его методов size() и capacity():

    cout <<"Size: "<< vdouble.size ()<<"Capacity: " << vdouble .capacity () <<end1;

    Есть еще функция max_size(), которая возвращает верхний предел размера и вместимости, определяемый обычно размером наибольшего доступного блока памяти.

    Функция resize () позволяет изменить размер массива. Функция is_empty () возвращает true, если вектор пуст (размер равен 0). Вместимость вектора можно изменить его функцией reserve (). Заблаговременное резервирование позволяет избежать частых автоматических выделений памяти:

    vdouble.reserve (1000);

    Функция clear () удаляет все элементы вектора.

    Функция assign () присваивает указанное значение первым n элементам:

    vdouble.assign (100, 1.0);

    Альтернативная форма функции позволяет присвоить элементам значения из диапазона другого контейнера:

    void assign (Input-Iterator first, Inputlterator last);

    Функции front() и back () возвращают значения соответственно первого и последнего элементов вектора.

    Наиболее часто используемыми функциями векторов являются, вероятно, erase () и insert (). Они служат для удаления и вставки элементов. При удалении элемента (или нескольких элементов) из вектора все последующие сдвигаются к началу. Эти функции перегружены; мы приводим только две формы insert ():



    iterator erase (iterator position) ;

    iterator erase (iterator first, iterator last) ;

    iterator insert(iterator pos, const T& x);

    void insert(iterator pos,

    Inputlterator first, Inputlterator last) ;

    Эти функции позволяют соответственно удалить элемент, удалить диапазон, вставить элемент и вставить диапазон элементов из другого контейнера.

    С помощью функций push_back () и pop_back () вектор можно использовать как стек. Первая из них вставляет элемент в конец вектора, вторая — удаляет конечный элемент (она не возвращает его значение).

    Вот небольшая иллюстрация:

    #include <iostream>

    #include <vector>

    #pragma hdrstop

    #include <condefs.h>

    using namespace std;

    //

    // Вспомогательная функция для вывода содержимого контейнера

    //

    template<class T> void Display(const Т &с) {

    cout<< "( " ;

    copy(с.begin (), c.end(),

    ostream_iterator<T::value_type> (cout, " "));

    cout << "} Size: " << c.size() << endl;

    }

    int main ()

    (

    int iarr[5] = (1, 2, 3, 4, 5);

    vector<int> vintl(iarr, iarr + 5);

    cout << "Initial vector : ";

    Display(vinti);

    vector<int>::iterator p =

    find(vinti.begin (), vintl.end(), 3);

    vinti.erase (p);

    cout << "After erasing 3: ";

    Display(vinti);

    vinti.insert (p, iarr, iarr + 3);

    cout << "After insertion: ";

    Display(vinti);

    cout << "Pop and push : ";

    vinti.pop_back();

    Display(vinti);

    vinti.push back(33);

    cout << " Display(vinti);

    vinti.pop_back ();

    return 0;

    }

    Программа выводит:

    Initial vector : {12345} Size: 5

    After erasing 3: {1245} Size: 4

    After insertion: {1212345} Size: 7

    Pop and push : {121234} Size: 6

    { 1 2 1 2 3 4 33 } Size: 7

    Полный список функций-элементов вектора вы можете найти в оперативной справке C++Builder'a.


    Содержание раздела