Re: как эффективно передать элементы из одного вектора в другой
От: watchmaker  
Дата: 07.04.16 16:15
Оценка: 3 (2)
Здравствуйте, 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(); // а тут честное копирование
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.