Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LectionSTL3.doc
Скачиваний:
1
Добавлен:
12.11.2019
Размер:
367.62 Кб
Скачать

Vegetables 3.12 200

Обратите внимание на закомментированную строку, в которой мы повторно пытаемся вывести содержимое памяти, на которую указывает ptr. Если снять комментирование данной строки, то программа скомпилируется, но при ее запуске будет сбой, т.к. после добавления объектов в контейнер происходит перераспределение памяти и, как уже говорилось, указатели и ссылки после вставки элементов становятся не действительными. Кроме того, не рекомендуется добавлять данные в середину вектора, поскольку это весьма затратная операция.

Можно также удалять элементы из вектора. Добавим в код следующие строки:

std::vector<inventory>::iterator temp=vector1.begin();

std::cout << *temp << std::endl;

Vector1.Pop_back();

std::cout << vector1.size() << std::endl;

std::cout << vector1.capacity() << std::endl;

std::cout << *temp << std::endl;

Введем итератор, указывающий на первый элемент. Затем мы удаляем последний элемент. При этом размер контейнера уменьшается на единицу и становится равным восьми, а емкость по-прежнему равна девяти, а указатель temp как и ранее корректно указывает на первый элемент, т.е. перераспределения памяти не происходит. Результат работы выглядит:

Books 40.12 5

Nothing 0 0

Tables 50.12 20

fruirs 4.23 150

Books 40.12 5

Books 40.12 5

Books 40.12 5

Nothing 0 0

Если же указатель temp ,будет указывать на конец вектора, то последнюю строку следует закомментировать, т.к. после точки удаления все указатели и ссылки становятся недействительными:

std::vector<inventory>::iterator temp=vector1.end()-1;

std::cout << *temp << std::endl;

Vector1.Pop_back();

std::cout << vector1.size() << std::endl;

std::cout << vector1.capacity() << std::endl;

//std::cout << *temp << std::endl;

Удалять можно точно также из середины вектора:

vector1.erase(vector1.begin()+1,vector1.end()-2);

std::cout << vector1.size() << std::endl;

std::cout << vector1.capacity() << std::endl;

std::cout << *temp << std::endl;

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

Books 40.12 5

Books 40.12 5

Nothing 0 0

Обратим внимание, что и после второго удаления диапазона из контейнера указатель на первый элемент по-прежнему действителен. Перераспределения памяти при удалении не происходит. Емкость по-прежнему равна девяти, хотя размер, т.е. количество элементов, уже равно трем. Для того, чтобы очистить контейнер, следует вызвать метод clear(). При этом все элементы будут удалены, т.е. размер контейнера станет нулевым, но емкость останется равна девяти.

Создать контейнер можно и другим способом:

std::vector<inventory> vector2(3,inventory());

При этом создается контейнер, чей размер и емкость, равны трем, который содержит копии объектов, созданных конструктором по умолчанию. Можно также создавать вектор, используя другие его конструкторы. Важным методом контейнера vector является метод reserve. Рассмотрим следующий код:

std::ofstream fout("test1.dat");

if(fout.is_open()!=true)

{

std::cout << "Can't open file!!" << std::endl;

return 1;

}

int n=50;

std::vector<inventory> vectorA;

for(int i=0; i<n; ++i)

{

std::vector<inventory>::size_type cap=vectorA.capacity();

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]