std :: move () с разными типами данных - PullRequest
0 голосов
/ 20 ноября 2018

У меня boost::array<int,8> array1 и std::vector<int> temp(8); как мне выполнить std::move() с boost::array до std::vector, я хочу избежать memcpy().

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Вы перемещаете что-то, если имеет смысл перемещать это.

array не содержит динамически распределенного буфера, так что нечего «красть».int не является объектом, который имеет смысл перемещать, поэтому, опять же, вы не можете даже перемещать отдельные элементы массива.

В двух словах, нет смысла перемещать array<int>.

0 голосов
/ 20 ноября 2018

boost::array и std::vector - это несвязанные типы в том смысле, что std::vector ничего не знает о том, как быть построенным из boost::array.

С другой стороны, вы можете использовать std::move с итераторами:

boost::array<int, 8> a;
std::vector<int> v;
v.reserve(a.size());

std::move(a.begin(), a.end(), std::back_inserter(v));
0 голосов
/ 20 ноября 2018

Вы не можете просто переместить кишки контейнера в std::vector.std::vector не предоставляет возможность стать владельцем буфера.Вам нужно будет скопировать / переместить отдельные элементы в std::vector.


Одна вещь, которую вы можете сделать, это переместить отдельные элементы в вектор, используя его конструктор итератора и std::make_move_iterator.Вы не увидите никакой выгоды с int, но если тип будет перемещаться быстрее, чем копировать, вы это сделаете.Это будет выглядеть как

some_container foo;
// populate foo
std::vector<some_type> moved_into{std::make_move_iterator(std::begin(foo)),
                                  std::make_move_iterator(std::end(foo))};
...