J'ai boost::array<int,8> array1 et j'ai std::vector<int> temp(8); comment faire std::move() de boost::array à std::vector, je veux éviter memcpy().

1
debonair 20 nov. 2018 à 21:06

3 réponses

Meilleure réponse

Vous ne pouvez pas simplement déplacer les entrailles du conteneur dans un std::vector. std::vector ne fournit pas un moyen de s'approprier un tampon. Vous devrez copier / déplacer les éléments individuels dans le std::vector.


Une chose que vous pouvez faire est de déplacer les éléments individuels dans le vecteur en utilisant son constructeur d'itérateur et {{X0 }}. Vous ne verrez aucun avantage avec un int, mais si le type est plus rapide à déplacer qu'à copier, vous le ferez. Cela ressemblerait à

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))};
7
NathanOliver 20 nov. 2018 à 18:13

Vous déplacez quelque chose s'il est logique de le déplacer.

array ne contient pas de tampon alloué dynamiquement, il n'y a donc rien à "voler". int n'est pas un objet qui a du sens à se déplacer, donc encore une fois, vous ne pouvez même pas déplacer des éléments individuels du tableau.

En un mot, il n'y a aucune signification de déplacer un array<int>.

0
David Haim 20 nov. 2018 à 18:13

boost::array et std::vector sont des types non liés dans le sens où std::vector ne sait rien sur la façon de construire à partir de boost::array.

D'autre part, vous pouvez utiliser std::move avec des itérateurs:

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

std::move(a.begin(), a.end(), std::back_inserter(v));
5
Jans 20 nov. 2018 à 23:17