- •Обязательное наличие в классе общедоступных методов: конструктора по умолчанию, конструктора копирования, деструктора и операции присваивания;
- •Inventory Inv("Books",40.12,5);
- •Vector1.Push_back(Inv);
- •Vegetables 3.12 200
- •Vector1.Pop_back();
- •Vector1.Pop_back();
- •VectorA.Push_back(inventory());
- •VectorA.Reserve(n);
- •VectorA.Push_back(inventory());
Inventory Inv("Books",40.12,5);
Vector1.Push_back(Inv);
При запуске данной программы мы получим следующий результат:
Constructor 1
Copy constructor 2
Destructor 1
Destructor 0
Размер контейнера vector1 стал равным единице, т.е. он содержит один элемент. В тоже время из работы программы видно, что создается два объекта, причем, используется конструктор копирования, а это говорит о том, что создается копия объекта, которая помещается в контейнер. Это является демонстрацией того, что в контейнер помещаются копии объектов. Можно и далее продолжать вставку элементов в конец контейнера:
std::vector<inventory> vector1;
inventory Inv("Books",40.12,5);
vector1.push_back(Inv);
vector1.push_back(inventory());
vector1.push_back(inventory("Tables",50.12,20));
vector1.push_back(inventory("fruirs",4.23,150));
vector1.push_back(inventory("vegetables",3.12,200));
Заметим, что количество элементов в контейнере стало равно пяти, но если мы вызовем метод capacity(), то результат будет равен шести. Это значит, что шестой элемент может быть добавлен без перераспределения памяти.
Вывести в файл содержание контейнера можно следующим образом:
std::ofstream fout("test1.dat");
if(fout.is_open()!=true)
{
std::cout << "Can't open file!!" << std::endl;
return 1;
}
for(int i=0; i<vector1.size();i++)
{
fout << vector1.at(i);
}
Обратите внимание на последнюю строку кода. Здесь элементы контейнера индексируются при помощи метода at(). Однако, более правильным будет следующий подход:
for(std::vector<inventory>::iterator itr=vector1.begin(); itr!=vector1.end();++itr)
{
fout << *itr;
}
В данном подходе мы объявляем переменную типа итератор контейнера vector<inventory>, а именно std::vector<inventory>::iterator и инициализируем ее итератором того же типа, указывающим на начало контейнера.
Результат вывода будет следующим:
Books 40.12 5
Nothing 0 0
Tables 50.12 20
fruirs 4.23 150
vegetables 3.12 200
Можно также осуществить вставку объекта в середину последовательности. Для этого рассмотрим следующий код:
std::vector<inventory> vector1;
inventory Inv("Books",40.12,5);
vector1.push_back(Inv);
vector1.push_back(inventory());
vector1.push_back(inventory("Tables",50.12,20));
vector1.push_back(inventory("fruirs",4.23,150));
vector1.push_back(inventory("vegetables",3.12,200));
std::vector<inventory>::iterator ptr= vector1.insert(vector1.end()-1,inventory());
std::cout << *ptr << std::endl;
vector1.insert(ptr,3,Inv);
//std::cout << *ptr << std::endl;
std::cout << vector1.size() << std::endl;
std::cout << vector1.capacity() << std::endl;
После того, как мы вставили в конец контейнера пять элементов, мы добавили в середину контейнера, а именно в позицию, находящуюся перед последним элементом, один объект, созданный конструктором по умолчанию. Место нахождения вставленного объекта сохранено в переменной ptr. Для того, чтобы убедиться, что это вставленный объект, результат выведен на экран. Далее мы вставили еще три копии объекта Inv перед позицией, на которую указывает ptr. Результат работы программы выглядит следующим образом:
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