Вектор С++: копировать или менять местами?

У меня есть класс с векторной переменной-членом, которую я заполняю следующим образом:

class Foo {
vector<int> v;
void g() {
  vector<int> w;
  // fill w
  v = w;
}

};

Мой вопрос: временной вектор w может стать огромным, и я не хочу платить за создание копии. Должен ли я использовать std::swap вместо копирования здесь? Насколько я понимаю, std::swap будет более эффективным из-за специализации для вектора (где он просто меняет местами указатели на кучу).


person ATemp    schedule 28.06.2012    source источник
comment
Разве вы не можете просто заполнить v напрямую, а не использовать временный?   -  person netcoder    schedule 28.06.2012
comment
Это зависит от того: вам нужно скопировать или поменять местами?   -  person Richard J. Ross III    schedule 28.06.2012
comment
@netcoder: Это небезопасно для исключений.   -  person Ben Voigt    schedule 28.06.2012
comment
Поддерживает ли ваш компилятор семантику перемещения? std::move отлично сработает, если w действительно временный.   -  person Chad    schedule 28.06.2012
comment
@Chad: w в v = w; не является значением r, поэтому оптимизация перемещения не может быть вставлена ​​сюда автоматически. Вы правы в том, что вы можете форсировать это с помощью std::move(w) (поэтому я указал это в своем ответе всего за пару секунд до вашего комментария).   -  person Ben Voigt    schedule 28.06.2012
comment
@BenVoigt: В этом коротком примере это не так, вы правы.   -  person netcoder    schedule 28.06.2012


Ответы (1)


Да, вы должны поменяться здесь. В C++11 вы также можете сказать v = std::move(w);.

В любом случае, переменная w сразу же выходит из области видимости, поэтому ее содержимое не имеет значения, и вы можете передать право собственности вместо копирования.

person Ben Voigt    schedule 28.06.2012
comment
Существуют ли в C++11 ситуации, когда мы предпочитаем свопинг вместо перемещения? - person ATemp; 28.06.2012
comment
@ATemp: Когда вам нужно поменять местами, а не переместить? То есть, когда вы просто хотите поменять местами состояние объектов (ни один из этих объектов не выходит за рамки напрямую). - person David Rodríguez - dribeas; 28.06.2012