c+ - Comment puis-je l' itérer sur les mots d'une chaîne

Mots clés : c++stringsplitc++

meilleur 5 Réponses c+ - Comment puis-je l' itérer sur les mots d'une chaîne

vote vote

92

#include <string> #include <sstream> #include <vector> #include <iterator>  template <typename Out> void split(const std::string &s, char delim, Out result) {     std::istringstream iss(s);     std::string item;     while (std::getline(iss, item, delim)) {         *result++ = item;     } }  std::vector<std::string> split(const std::string &s, char delim) {     std::vector<std::string> elems;     split(s, delim, std::back_inserter(elems));     return elems; } 
std::vector<std::string> x = split("one:two::three", ':'); 
vote vote

83

#include <iostream> #include <string> #include <sstream> #include <algorithm> #include <iterator>  int main() {     using namespace std;     string sentence = "And I feel fine...";     istringstream iss(sentence);     copy(istream_iterator<string>(iss),          istream_iterator<string>(),          ostream_iterator<string>(cout, "\n")); } 
vector<string> tokens; copy(istream_iterator<string>(iss),      istream_iterator<string>(),      back_inserter(tokens)); 
vector<string> tokens{istream_iterator<string>{iss},                       istream_iterator<string>{}}; 
vote vote

77

#include <boost/algorithm/string.hpp> std::vector<std::string> strs; boost::split(strs, "string to split", boost::is_any_of("\t ")); 
vote vote

64

#include <vector> #include <string> #include <sstream>  int main() {     std::string str("Split me by whitespaces");     std::string buf;                 // Have a buffer string     std::stringstream ss(str);       // Insert the string into a stream      std::vector<std::string> tokens; // Create vector to hold our words      while (ss >> buf)         tokens.push_back(buf);      return 0; } 
vote vote

55

template < class ContainerT > void tokenize(const std::string& str, ContainerT& tokens,               const std::string& delimiters = " ", bool trimEmpty = false) {    std::string::size_type pos, lastPos = 0, length = str.length();     using value_type = typename ContainerT::value_type;    using size_type  = typename ContainerT::size_type;     while(lastPos < length + 1)    {       pos = str.find_first_of(delimiters, lastPos);       if(pos == std::string::npos)       {          pos = length;       }        if(pos != lastPos || !trimEmpty)          tokens.push_back(value_type(str.data()+lastPos,                (size_type)pos-lastPos ));        lastPos = pos + 1;    } } 

Questions similaires