102 votes

Bonne façon de diviser une chaîne std :: en un vecteur <string>

Duplicata possible:
Comment diviser une chaîne?

Quelle est la bonne façon de diviser une chaîne en un vecteur de chaînes. Le délimiteur est un espace ou une virgule.

141voto

UncleBens Points 24580

Un moyen pratique serait la bibliothèque d'algorithmes de chaîne de boost .

 std::vector<std::string> words;
std::string s;
boost::split(words, s, boost::is_any_of(", "), boost::token_compress_on);
 

109voto

Nawaz Points 148870

Pour les chaînes séparées par des espaces, vous pouvez alors faire ceci:

 std::string s = "What is the right way to split a string into a vector of strings";
std::stringstream ss(s);
std::istream_iterator<std::string> begin(ss);
std::istream_iterator<std::string> end;
std::vector<std::string> vstrings(begin, end);
std::copy(vstrings.begin(), vstrings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
 

Production:

 What
is
the
right
way
to
split
a
string
into
a
vector
of
strings
 

Démo en ligne: http://ideone.com/d8E2G


chaîne ayant à la fois une virgule et un espace

 struct tokens: std::ctype<char> 
{
    tokens(): std::ctype<char>(get_table()) {}

    static std::ctype_base::mask const* get_table()
    {
        typedef std::ctype<char> cctype;
        static const cctype::mask *const_rc= cctype::classic_table();

        static cctype::mask rc[cctype::table_size];
        std::memcpy(rc, const_rc, cctype::table_size * sizeof(cctype::mask));

        rc[','] = std::ctype_base::space; 
        rc[' '] = std::ctype_base::space; 
        return &rc[0];
    }
};

std::string s = "right way, wrong way, correct way";
std::stringstream ss(s);
ss.imbue(std::locale(std::locale(), new tokens()));
std::istream_iterator<std::string> begin(ss);
std::istream_iterator<std::string> end;
std::vector<std::string> vstrings(begin, end);
std::copy(vstrings.begin(), vstrings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
 

Production:

 right
way
wrong
way
correct
way
 

Démo en ligne: http://ideone.com/aKL0m

10voto

Tod Points 3501

Si la chaîne contient à la fois des espaces et des virgules, vous pouvez utiliser la fonction de classe de chaîne

 found_index = myString.find_first_of(delims_str, begin_index) 
 

en boucle. Recherche de! = Npos et insertion dans un vecteur. Si vous préférez la vieille école, vous pouvez également utiliser des C

 strtok() 
 

méthode.

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