#cpp #vector
Имеется некий код: A a1; A a2; A a3; std::vector a; std::cout << "Push back a1" << std::endl; a.push_back(a1); std::cout << "Push back a2" << std::endl; a.push_back(a2); std::cout << "Push back a3" << std::endl; a.push_back(a3); И разумеется класс А. class A { static int ACount; private: public: A() { std::cout << "Constructor called. Objects = " << ++ACount << std::endl; } ~A() { std::cout << "Destructor called. Objects = " << --ACount << std::endl; } A(const A &a) { std::cout << "Copy Constructor called. Objects = " << ++ACount << std::endl; } }; int A::ACount; Вывод с консоли такой: Constructor called. Objects = 1 Constructor called. Objects = 2 Constructor called. Objects = 3 Push back a1; Copy constructor called. Objects = 4 Push back a2; Copy constructor called. Objects = 5 Copy constructor called. Objects = 6 Destructor called. Objects = 5 Push back a3; Copy constructor called. Objects = 6 Copy constructor called. Objects = 7 Copy constructor called. Objects = 8 Destructor called. Objects = 7 Destructor called. Objects = 6 Destructor called. Objects = 5 Destructor called. Objects = 4 Destructor called. Objects = 3 Destructor called. Objects = 2 Destructor called. Objects = 1 Destructor called. Objects = 0 Не могу понять почему при вызове метода Push_back(а2) вызывается 2 раза конструктор копирования, а при Push_back(а3) целых 3 раза. Пытаюсь создать некое подобие граф движка и создание\уничтожение такого числа объектов мне очень навредит. Как быть? Или стоит поискать некий иной контейнер?
Ответы
Ответ 1
Происходит переаллокация вектора при каждом push_back. Вы видите вызовы конструкторов копирования для копирования элементов со старого места на новое, а затем деструкцию элементов на старом месте. Сделайте предварительное a.reserve(100); и "лишние" копирования и деструкции пропадут.Ответ 2
Не могу понять почему при вызове метода Push_back(а2) вызывается 2 раза конструктор копирования, а при Push_back(а3) целых 3 раза При увеличении размера вектора создается новый вектор, в него копируются все элементы старого и заpushенный элемент, а затем все элементы старого уничтожаются. Это связанно с тем, что вектор гарантирует последовательное непрерывное хранение элементов в памяти. Как быть? Можно заранее зарезервировать достаточное количество элементов. Или стоит поискать некий иной контейнер? Это зависит от того, что вам нужно от контейнера. Какие именно операции вы будете с ним делать. У вектора поиск произвольного элемента идет за константное время, а добавление нового (если специально не резервировать пространство) - за O(N). Также вектор можно передавать в функции как указатель на C-like массив. У списка за константное время идет поиск, добавление и удаление первого и последнего элемента, а произвольного элемента - за O(N).
Комментариев нет:
Отправить комментарий