Используйте std :: vector для создания объекта и использования его - PullRequest
1 голос
/ 16 ноября 2010

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

Прямо сейчас я использую его как стандартный:: vector из указателей, но я не могу вызвать std :: vector :: clear (), не удаляя каждый объект ранее, и я не могу использовать std :: auto_ptr с контейнерами std.

Я хотел сделать что-то вродеthis:

vector<MyClass> MyVec;
MyVec.push_back();
MyClass &item = MyVec.back();

Это создаст новый объект с конструктором по умолчанию, а затем я смогу получить ссылку и поработать с ней.

Есть идеи по этому направлению?

РАЗРЕШЕНО : Я использовал ответ @MSalters с предложением @ Moo-Juices, чтобы использовать C ++ 0x rvalue ссылки, чтобы использовать семантику std :: move.Основано на этой статье .

Ответы [ 4 ]

3 голосов
/ 16 ноября 2010

Вместо хранения объектов храните shared_ptr.Это позволит избежать копирования объекта и автоматически уничтожит объект при удалении из вектора.

3 голосов
/ 16 ноября 2010

Boost.PointerContainer классы будут управлять памятью для вас. Смотрите особенно ptr_vector .

С контейнером boost::ptr_vector<T> вы можете использовать push_back(new T);, и память для T элементов будет освобождена, когда контейнер выйдет за пределы области.

1 голос
/ 16 ноября 2010

Почти там:

vector<MyClass> MyVec;
MyVec.push_back(MyClass()); // Any decent compiler will inline this, eliminating temporaries.
MyClass &item = MyVec.back();
0 голосов
/ 16 ноября 2010

Вы можете сделать это с помощью resize, который по умолчанию создаст любые дополнительные объекты, которые он должен добавить к vector:

vector MyVec;
MyVec.resize(MyVec.size() + 1);
MyClass &item = MyVec.back();

Но подумайте, зачем вам это нужно. Действительно ли профилирование показало, что копировать объекты вокруг слишком дорого? Они не копируются?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...