Пожалуйста, обратите внимание на следующее:C STL ++ контейнер и место строительства
class CMyClass
{
public:
CMyClass()
{
printf("Constructor\n");
}
CMyClass(const CMyClass&)
{
printf("Copy constructor\n");
}
};
int main()
{
std::list<CMyClass> listMyClass;
listMyClass.resize(1);
return 0;
}
Он производит следующий вывод:
Конструктор
конструктор копирования
Теперь мой вопрос: как избежать конструктора копирования? Или по-другому: как я могу создавать объекты внутри контейнера STL без ненужной операции копирования. Есть ли способ сделать «на месте» с использованием конструктора по умолчанию?
Обновление - ответы до сих пор:
- Это не может быть сделано
- Используйте указатели или умные указатели вместо.
Умные указатели являются излишним для моего применения. Но я действительно удивляюсь, почему этого не может быть сделано. Похоже, это такая очевидная вещь, которую нужно делать. Любые другие идеи? Я даже принять неприятный хак, если он работает ...
Решение
Я думаю, что я только что нашел решение моей проблемы со всеми комментариями и ответами, заданные здесь. Решение состоит в том, чтобы создать пустой объект и сохранить его с единственной целью использовать его позже для создания чистых копий. Затем вы можете использовать один из методов, которые принимают ссылку (например, push_back или insert). Это по-прежнему вызывает конструктор копирования для каждого нового объекта вставленного, но, по крайней мере, это не как конструктор по умолчанию и конструктор копирования:
int main()
{
CMyClass Empty;
std::list<CMyClass> listMyClass;
for (int c=0; c<10; ++c)
{
listMyClass.push_back(Empty);
}
return 0;
}
Это может показаться очевидная вещь, но с функциональной точки зрения это не имеет значения, и несколько алгоритмов (sort, remove, ...) также используют копирование, поэтому будьте готовы к копированию;) (См. также http: //www.devx .com/tips/Tip/13606) – stefaanv
Очевидная вещь? Почему это? Почему копирование проблемы? – jalf
Очевидно? Если вы вызвали 'mylist.resize (10)', как бы вы ожидали, что закончите с десятью различными объектами, если они не являются копиями? – visitor