Попытка использовать STL без умных указателей - попытка избежать создания временного объекта - PullRequest
0 голосов
/ 20 июня 2010

Мне особенно нравится простота использования контейнеров STL простым способом.

Я так и не понял, как заставить библиотеку Boost работать на моих платформах разработчиков, на самом деле я даже не думал, что пытался это сделать.Я думаю, вы могли бы сказать, что я просто пытаюсь отложить неизбежное, так как Boost, безусловно, является полезной библиотекой, которую я должен использовать.

Но мой вопрос по сути такой же, как и в этой теме: Как инициализировать вектор / список STL с классом без вызова конструктора копирования

У меня есть std::list<ExpensiveClass> mylist;и я просто хочу функцию, которая помещает новый экземпляр в список и вызывает конструктор по умолчанию, а не копирует его из его временного стека.В другой теме упоминалось о конструкторах ходов.Я посмотрел на них, и, откровенно говоря, это только вселяет страх в мое сердце.Два амперсанда !!

Сработало бы, если бы я только сделал массив объектов ExорогоClass?ExpensiveClass *mylist = new ExpensiveClass[20]; Это вызывает конструктор 20 раз?

Мне кажется, я должен просто использовать boost: ptr_list.

Ответы [ 3 ]

7 голосов
/ 20 июня 2010

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

Если вы решите использовать контейнер интеллектуальных указателей, вы можете использовать один из них.контейнеров указателя Boost или вы можете использовать контейнер STL shared_ptr s .

Чтобы ответить на ваш вопрос о:

ExpensiveClass *mylist = new ExpensiveClass[20];

Конструктор по умолчанию для ExpensiveClass вызывается 20 раз: один раз для каждого элемента массива.

3 голосов
/ 20 июня 2010

Мне просто нужна функция, которая помещает новый экземпляр в список и вызывает конструктор по умолчанию

Поскольку вы упомянули "два амперсанда", я собираюсь дать вам решение C ++ 0x:

mylist.emplace_back();

Если вы хотите использовать другой конструктор, просто предоставьте аргументы:

mylist.emplace_back(whatever, arguments, your, constructor, takes);

Эта функция-член создает объект на месте, без копирования (или перемещения).

0 голосов
/ 20 июня 2010

В зависимости от поддержки реализации функций C ++ 0x, посмотрите на emplace_back и аналогичные функции-члены - они выполняют именно то, что вы просите, т.е. создаете объект непосредственно внутри контейнера, «на месте», безлюбое копирование.

...