Подтвердить что ты не робот

Перемещение элементов из std::vector в другое

Как перенести некоторые элементы из первого вектора на второй, а элементы будут удалены из первого? если я использую std::move, элементы не удаляются из первого вектора.
это код, который я написал:

   move(xSpaces1.begin() + 7, xSpaces1.end(), back_inserter(xSpaces2));
4b9b3361

Ответ 1

std::move позволяет перемещать объекты, а не копировать их, что позволяет увеличить скорость выполнения. Экономия может быть еще больше при перемещении диапазона значений. Однако, когда вы перемещаете диапазон из контейнера, контейнер по-прежнему удерживает места, которые когда-то были заняты этими значениями.

Вам нужно вручную изменить размер контейнера, чтобы удалить эти заполнители, если вы хотите избавиться от них (вам не обязательно, если вы предпочитаете повторно использовать эти пятна контейнера для других элементов). Один из способов сделать это - вызвать vector::erase в том же диапазоне, который вы вывели из контейнера.

Ответ 2

std::move и std::copy работают с элементами, а не с контейнерами. Вы должны мутировать контейнер отдельно. Например, чтобы перенести первые 17 элементов v1 в новый вектор v2:

std::vector<Foo> v1, v2;

// populate v1 with at least 17 elements...

auto it = std::next(v1.begin(), 17);

std::move(v1.begin(), it, std::back_inserter(v2));  // ##

v1.erase(v1.begin(), it);

После строки ## первые 17 элементов v1 все еще существуют, но они были "перемещены из", поэтому они находятся в неопределенном состоянии.

Ответ 3

Вы не можете перемещать элементы из одного вектора в другой так, как вы думаете; вам всегда нужно стереть позиции элементов из первого вектора.

Если вы хотите изменить все элементы из первого вектора во второй и наоборот, вы можете использовать swap.

Если вы хотите переместить одинаковое количество элементов между двумя векторами, вы можете использовать swap_ranges