Создание и заполнение 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”. Присваивание полностью заменяет элементы вектора. После присваивания размер вектора становится равным числу присвоенных элементов.