перемещать объекты между контейнерами без копирования - PullRequest
4 голосов
/ 11 февраля 2012

У меня есть глобальный вектор указателей объектов, и я генерирую объекты такого же типа и помещаю их в вектор внутри цикла. То есть:

vector<object * > ptrVector;
vector<object > objVector;

for ( ; ;)
{
    getElements(objVector);
    calcualte_with(objVector);
    objVector.clear();
}

У меня вопрос, как я могу "переместить" объекты в objVector в ptrVector без копирования накладных расходов?

Ответы [ 2 ]

3 голосов
/ 11 февраля 2012

Краткий ответ - вы не можете.

ptrVector содержит указатели, а не экземпляры object, поэтому объекты никогда не могут быть "внутри", перемещая их или иным образом, с или безиздержки копирования.

Объекты, которые находятся "в" objVector, могут существовать только после clear(), вызываемого в векторе, если сама objVector сначала поменялась местами или (в C ++ 11) перемещена в другуюэкземпляр vector<object>.

3 голосов
/ 11 февраля 2012

Короче говоря, вы не можете с C ++ 98 / C ++ 03.Объекты в objVector размещаются и принадлежат objVector, и когда вы уничтожаете или очищаете его, элементы также будут уничтожены.

С C ++ 11 вы можете реализовать конструктор перемещения для вашего объекта и заполнить ptrVectorновые объекты, которые были сконструированы с перемещением из объектов в objVector.В общем случае конструкторы перемещения перемещают закрытые члены объекта, избегая копирования любой большой структуры данных, выделенной в куче, которая принадлежит объекту, что обычно очень дешево.

Чтобы сделать это, вы 'Использовать что-то вроде std::transform(begin(objVector), end(objVector), std::back_inserter(ptrVector), [](object& o){return new object(std::move(o);})

Однако я бы рекомендовал сделать ptrVector std::vector<std::unique_ptr<object>> или std::vector<std::shared_ptr<object>> вместо использования необработанного указателя, если ptrVector обладает исключительным или общим владением объектами, на которые указываетэто соответственно.

...