C ++: moyen élégant de diviser une chaîne et de farcir son contenu dans std :: vector

Je voudrais diviser une chaîne le long des espaces, et je sais que les jetons représentent des entiers valides. Je voudrais transformer les jetons en nombres entiers et y peupler un vecteur.

Je pourrais utiliser boost :: split, créer un vecteur de chaînes de jetons, puis utiliser std :: transform.

Quelle est votre solution? L’utilisation de boost est acceptable.

Quelque chose comme ça:

std::issortingngstream iss("42 4711 "); std::vector results( std::istream_iterator(iss) , std::istream_iterator() ); 

?

Vous pouvez utiliser Boost.Tokenizer . Il peut facilement être explode_ssortingng dans une fonction explode_ssortingng qui prend une chaîne et le délimiteur et renvoie un vecteur de jetons.

Utiliser transform sur le vecteur retourné est une bonne idée pour la transformation de chaînes en entiers; vous pouvez également simplement passer l’iterator Boost.Tokenizer dans l’algorithme de transform .

Utilisez la bibliothèque d’algorithmes de chaînes de Boost pour split la chaîne en un vecteur de chaînes, puis std::for_each et atoi ou boost::lexical_cast pour les boost::lexical_cast en boost::lexical_cast . Cela sera probablement beaucoup plus simple que d’autres méthodes, mais n’aura peut-être pas les meilleures performances en raison de la copie (si quelqu’un a un moyen de l’améliorer et de le supprimer, veuillez commenter).

 std::vector numbers; void append(std::ssortingng part) { numbers.push_back(boost::lexical_cast(part)); } std::ssortingng line = "42 4711"; // borrowed from sbi's answer std::vector parts; split(parts, line, is_any_of(" ,;")); std::for_each(parts.being(), parts.end(), append); 

Grossièrement.

http://www.boost.org/doc/libs/1_44_0/doc/html/ssortingng_algo.html http://www.boost.org/doc/libs/1_44_0/libs/conversion/lexical_cast.htm

Vous pouvez toujours utiliser strtok ou ssortingng.find ().