2014-11-17 4 views
1

Рассмотрим следующий класс:Как перенести внутренние объекты объекта?

class Big 
{ 
public: 
    std::vector<int> convertToVector(); 
private: 
    std::vector<int> data_; 
}; 

Я хочу Big::convertToVector() потрошить объект и движение данные снаружи.

Я рассматривал:

std::vector<int> Big::convertToVector() 
{ 
    return std::move(data_); 
} 

Является ли это правильный способ сделать это?

+2

Да. Это способ перемещения данных. – Jagannath

ответ

1

Да, это правильный путь.

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

std::vector<int> Big::convertToVector() { 
    std::vector<int> temp; 
    std::swap(temp, _data); 

    return std::move(temp); 
} 
+1

Любой объект, который был перемещен, должен оставаться в силе, поэтому своп не нужен. Я просто не знал о типе возврата. –

+0

@MartinDrozdik oopsie, кажется, что вы правы - * гарантированно оставить аргумент move-from в действительном, но неуказанном состоянии *. Я бы сказал, что, кстати, все еще делает мое решение разумным. Он также должен нести минимальные накладные расходы. –

+0

@MartinDrozdik И пока мы на нем, если вы написали его как 'std :: vector Big :: convertToVector() &&', вы можете пропустить этот обмен полностью, потому что объект должен быть уничтожен после вызова в любом случае. –

-1

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

std::vector<int> Big::convert_to_vector() { return data_; } 
+1

Это просто создает копию 'data_' –

+0

для исправления. –

Смежные вопросы