Здравствуйте, sci_reseacher, Вы писали:
_>Как наиболее эффективно (правильно) выполнить передачу (копирование, перемещение ... ) значений из одного вектора x (внутри объекта некоторого класса) в другой вектор y или z, который находиться вне класса в С++11?
Для перемещения — просто и без затей:
std::vector<int> z = std::move(a.x);
Для копирования есть два варианта. Если вектор, в который происходит копирование, уже существует, обладает ненулевым capacity и есть желание эту ёмкость переиспользовать, то можно делать
z.assign(a.x.begin(), a.x.end());
Во всех остальных случаях — просто копируй:
std::vector<int> z = a.x;
Как это всё будет в функции завёрнуто, есть член x хочется сделать недоступным извне класса, — по большом счёту не так уж и важно.
Можно простую обёртку сделать
std::vector<int>&& A::ConsumeX() {
return std::move(x);
}
Или через ref-qulifiers отдать выбор нужной перегрузки компилятору:
using V = std::vector<int>;
const V& CopyX() const& {
return x;
}
V&& CopyX() && {
return std::move(x);
}
void CopyTo(V& target) const& {
target.assign(x.begin(), x.end());
}
void CopyTo(V& target) && {
target.swap(x);
}
Тогда, например, получится
V data1;
data1.reserve(1000);
A a;
a.CopyTo(data1); // переиспользование выделенного буфера в data1
V data2 = A().CopyX(); // на самом деле не копирование, а перемещение из x
V data3 = a.CopyX(); // а тут честное копирование