50 votes

Conversion de std::string en std::vector<char>

J'utilise une bibliothèque qui accepte des données sous forme de vector de char s. Je dois passer un string à la bibliothèque.

Je pense à utiliser std::vector qui accepte les itérateurs pour effectuer la conversion - mais je me demande s'il n'y a pas une meilleure façon de procéder ?

/*Note: json_str is of type std::string*/
const std::vector<char> charvect(json_str.begin(), json_str.end());

37voto

Xeo Points 69818

Non, c'est comme ça qu'il faut faire, en initialisant directement le vecteur avec les données de la chaîne.

Comme le souligne @ildjarn dans son commentaire, si pour une raison quelconque votre tampon de données doit être à terminaison nulle, vous devez l'ajouter explicitement avec charvect.push_back('\0') .

Notez également que si vous souhaitez réutiliser le tampon, utilisez la fonction assign fonction membre qui prend les itérateurs.

18voto

John Dibling Points 56814

Votre méthode pour remplir le vector est bien - en fait, c'est probablement mieux dans la plupart des cas.

Pour que vous sachiez toutefois que ce n'est pas la seule solution. Vous pouvez aussi simplement copier le contenu du fichier string dans le vector<char> . Cette fonction est particulièrement utile lorsque vous disposez d'un système de gestion de l'information. vector déjà instancié, ou si vous voulez ajouter des données à la fin - ou à n'importe quel moment, vraiment.

Exemple, où s est un std::string y v est un std::vector<char> :

std::copy( s.begin(), s.end(), std::back_inserter(v));

Comme dans le cas du constructeur, si vous avez besoin d'un terminateur nul, vous devrez le repousser vous-même :

v.push_back('\0');

0voto

Bill Sellers Points 23

Une alternative qui pourrait valoir la peine d'être envisagée si vous avez besoin de la nullité de terminaison est :

std::vector<char> charvect(json_str.c_str(), json_str.c_str() + json_str.size() + 1); 

et si charvect qui existe déjà, vous pouvez le faire :

charvect.assign(json_str.c_str(), json_str.c_str() + json_str.size() + 1);

Cela peut être plus rapide que de faire un push_back('\0') en particulier si le push_back déclenche une réallocation de mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X