std :: se déplace entre std :: string et std :: vector & lt; unsigned char & gt;
Je travaille avec 2 bibliothèques. On prend et retourne std::string
s, tandis que l'autre utilise std::vector<unsigned char>
s.
Ce serait bien si je pouvais voler le sous-jacent de tableaux à partir de std::string
et std::vector<unsigned char>
et être en mesure de déplacer les uns les autres sans la copie excessive.
ATM-je utiliser quelque chose comme:
const unsigned char* raw_memory =
reinterpret_cast<const unsigned char*>(string_value.c_str()),
std::vector<unsigned char>(raw_memory, raw_memory + string_value.size();
Et dans l'autre sens:
std::string(
reinterpret_cast<const char*>(&vector_value[0]),
vector_value.size());
Il serait de loin préférable d'être en mesure de définir un:
std::string move_into(std::vector<unsigned char>&&);
std::vector<unsigned char> move_into(std::string&&);
source d'informationauteur genjix
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas possible.
La
vector
etstring
classe ne fournissent pas de moyen de voler à partir d'autre chose que devector
oustring
respectivement. Ils ne sont pas destinés à échanger des contenus.Le problème le problème, c'est que
vector
etstring
peut avoir largement sous-jacentes différentes représentations. Généralement dans gcc par exemple,string
utiliser le peu vieux COW (Copy on Write) "optimisation", ce qui est largement différent de la typiquevector
représentation (généralement juste un triple de pointeurs/size_t attributs).Si vous êtes aux prises avec des octets, le blâme, la bibliothèque a décidé de mettre en
string
et refactoriser le code si vous le pouvez.Autrement: copie. Le
reinterpret_cast
ne devrait pas être nécessaire carchar
etunsigned char
ont conversions implicites entre eux (et maintenantchar
est souventunsigned
par défaut).Vous pouvez utiliser l'initialisation à l'aide des itérateurs. Jetez un oeil ici
EDIT: coller le code de sorte que vous ne avez pas à aller à ideone. Tout en laissant le lien de sorte que vous pouvez jouer autour avec le code