Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
STL5 / lab1-vector / lab1-vector.doc
Скачиваний:
12
Добавлен:
10.04.2015
Размер:
183.3 Кб
Скачать

Создание и заполнение vector

Интерфейс класса vectorсодержит следующие методы создания и заполнения его элементами.

template <class T, class A=allocator<T>> class vector {

public:

//…..

// создает пустой вектор

explicit vector (const A& = A());

// создает вектора содержащего n копий объекта val

explicit vector(size_type n, const T& val = T(), const A&=A());

// создание вектора и заполнение его элементами содержащимися в

// последовательности задаваемой итераторами [first:last),

// последний элемент не включается

// In должен быть итератором для чтения (итератором ввода)

template <class In>

vector(In first, In last, const A& = A() );

vector (const vector& x); // Конструктор копий

~vector();

vector& operator = (const vector& x);

// заполнение вектора элементами последовательности задаваемой

// итераторами [first:last)

template <class In>

void assign(In first, In last);

// заполнение вектора n копиями значения val

void assign (size_type n, const T& val);

//…..

};

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

Например:

vector<Record> vr(10000); // Объявление вектора содержащего 10000 Record

vector<int> v(10) ; // правильно, вектор из 10 int

vector<int> v2 = vector<int>(10); // правильно, вектор из 10 int

vector<int> v3 = v2; // правильно, вектор является копией другого

vector<int> v4 = 10; // ошибка: конструктор от int объявлен explicit

void f(int size1, int s2)

{

vector<int> vi (size1);

vector<double>* p = new vector<double>(size2);

}

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

void f(const vector<double>& vecDouble)

{

vector<double> v1(vecDouble.begin(),vecDouble.end()); // копирование элементов

// из списка

char p[] = “despair”;

vector<char>v2(p, &p[sizeof(p)-1]); // копирование элементов из С-строки

// в данном случае используется тот факт указатель языка С имеет интерфейс

// совпадающий с интерфейсом итератора (операторы * и ++)

}

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

void f1(vector<int>&);

void f2(const vector<int>&);

void h()

{

vector<int> v(10000);

//…….

f1(v);

f2(v);

}

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

#include <vector>

#include <iostream>

using namespace std;

int main()

{

vector<char> v;

char s[] = "aaaaa";

v.assign(s, &s[sizeof(s)-1]);

for (int i=0; i<v.size(); i++)

cout<<v[i]<<" ";

return 0;

}

Теперь в векторе vнаходится “aaaaa”. Присваивание полностью заменяет элементы вектора. После присваивания размер вектора становится равным числу присвоенных элементов.

Соседние файлы в папке lab1-vector