Quelle est la idiomatiques façon à ajouter une tranche d'un vecteur?
J'ai une tranche de &[u8]
et j'aimerais ajouter à un Vec<u8>
avec un minimum de la copie. Voici deux approches que je sais de travail:
let s = [0u8, 1u8, 2u8];
let mut v = Vec::new();
v.extend(s.iter().map(|&i| i));
v.extend(s.to_vec().into_iter()); //allocates an extra copy of the slice
Est-il un meilleur moyen de le faire dans de Rouille stable? (rustc 1.0.0-beta.2
)
Vous devez vous connecter pour publier un commentaire.
Il y a une méthode qui fait exactement cela:
Vec::extend_from_slice
Exemple:
Qui est en fait l'équivalent de l'aide
.map(|&i| i)
et il ne minimale la copie.Le problème est que vous devez absolument ne peut pas éviter de copier dans ce cas. Vous ne pouvez pas il suffit de déplacer les valeurs, car une tranche n'est pas propriétaire de son contenu, donc il ne peut prendre une copie.
Maintenant, cela dit, il y a deux choses à considérer:
Rouille tend intégrée plutôt de l'agressivité; il existe suffisamment d'informations dans le présent code pour le compilateur de simplement copier les valeurs directement dans la destination sans aucune étape intermédiaire.
Fermetures dans la Rouille ne sont pas comme les fermetures dans la plupart des autres langues: ils ne nécessitent pas d'allocation de tas et peut être directement incorporé, ce qui le rend pas moins efficace que le codage en dur des comportements directement.
Ne garder à l'esprit que les deux ci-dessus dépendent de l'optimisation: ils vont généralement pour le mieux, mais ne sont pas garantis.
Mais après avoir dit cela... ce que vous êtes en train d'essayer de faire ici, dans cette spécifiques exemple est d'ajouter une pile alloué tableau qui vous ne propre. Je ne suis pas au courant de toute bibliothèque de code qui peuvent réellement tirer parti de cet état de fait (le support pour tableau de valeurs est plutôt faible dans la Rouille à l'instant), mais en théorie, vous pourriez créer efficacement un
into_iter()
équivalent de l'aide du code unsafe... mais je ne le recommande pas, et ce n'est probablement pas en valeur la dispute.Je ne peux pas parler pour la pleine incidence sur les performances, mais
v + &s
va travailler sur la bêta, je crois que c'est juste similaire à pousser chaque valeur sur l'origine Vec.