каков лучший способ переместить элементы: весь вектор или переместить стереть элементы?

#c

Вопрос:

Мне интересно, как лучше всего перемещать элементы из одного вектора в другой .Допустим, вы можете это сделать :

 std::vector<int> v(10);
std::fill(std::begin(v), std::end(v), 5);
std::vector<int> move_v = std::move(v);
 

А потом все работает так, как я и думал: std::size(v) печатает 0, и в другом векторе появились элементы. С другой стороны.

Я видел, что часто предлагается сделать что-то подобное:

 std::vector<int> v(10);
std::vector<int> move_v(10);
std::fill(std::begin(v), std::end(v), 5);

std::move(std::begin(v), std::end(v), std::begin(move_V));
v.erase(std::begin(v), std::end(v));
 

Но это работает не совсем так хорошо, как я ожидаю.Почему элементы после std::move не перемещены сюда,то есть здесь элементы в векторе v остаются на месте.И нам нужно вызвать erase функцию .Они перемещаются или копируются?На самом деле, мне интересно, какой подход считается лучшим ?

Ответ №1:

В первом примере вы перемещаете весь вектор сразу. По-видимому, это то, чего вы хотите. Просто скопируйте пару указателей, и все готово. O(1) сложность, и все хорошо.

Во втором примере вы перемещаете каждый элемент по отдельности. Это означает, что вы пытаетесь переместить целые числа, что то же самое, что копирование. Таким образом, никакого перемещения не происходит. Вероятно, это не то, чего вы хотите.

Комментарии:

1. А если в общем случае? то есть, будет какой-то пользовательский тип данных, а не int?

2. Если у вас есть класс, например std::string , все эти элементы будут перемещены. Все равно, наверное, не то, что ты хочешь.

3. То есть получается лучше всегда использовать 1 метод?

4. @Omegon В данном конкретном случае, да. 1-й метод может не подходить, если вы перемещаете элементы в одном контейнере и т. Д. В таком случае вам придется сделать второе.