Richtiger Weg, um einen std :: string in einen Vektor aufzuteilen

Mögliche Duplikate:
Wie spalte ich eine Zeichenfolge?

Was ist der richtige Weg, um einen String in einen Vektor von Strings aufzuteilen? Trennzeichen ist Leerzeichen oder Komma.

Für Leerzeichen getrennte Strings, dann können Sie dies tun:

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

Ausgabe:

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

Online-Demo: http://ideone.com/d8E2G


Zeichenfolge, die sowohl Komma als auch Leerzeichen enthält

 struct tokens: std::ctype { tokens(): std::ctype(get_table()) {} static std::ctype_base::mask const* get_table() { typedef std::ctype 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 begin(ss); std::istream_iterator end; std::vector vstrings(begin, end); std::copy(vstrings.begin(), vstrings.end(), std::ostream_iterator(std::cout, "\n")); 

Ausgabe:

 right way wrong way correct way 

Online-Demo: http://ideone.com/aKL0m

Ein praktischer Weg wäre die String-Algorithmus-Bibliothek von boost .

 #include  // Include boost::for is_any_of #include  // Include for boost::split // ... std::vector words; std::string s; boost::split(words, s, boost::is_any_of(", "), boost::token_compress_on); 

Wenn die Zeichenfolge Leerzeichen und Kommas enthält, können Sie die String-classnfunktion verwenden

 found_index = myString.find_first_of(delims_str, begin_index) 

in einer Schleife. Suche nach! = Npos und Einfügen in einen Vektor. Wenn Sie die alte Schule bevorzugen, können Sie auch C’s benutzen

 strtok() 

Methode.

 vector split(string str, string token){ vectorresult; while(str.size()){ int index = str.find(token); if(index!=string::npos){ result.push_back(str.substr(0,index)); str = str.substr(index+token.size()); if(str.size()==0)result.push_back(str); }else{ result.push_back(str); str = ""; } } return result; } 

Blockquote

split (“1,2,3”, “,”) ==> [“1”, “2”, “3”]

split (“1,2,”, “,”) ==> [“1”, “2”, “”]

split (“1token2token3”, “token”) ==> [“1”, “2”, “3”]

Ich machte diese benutzerdefinierte function, die die Linie in Vektor umwandeln wird

 #include  #include  #include  #include  using namespace std; int main(){ string line; getline(cin, line); int len = line.length(); vector subArray; for (int j = 0, k = 0; j < len; j++) { if (line[j] == ' ') { string ch = line.substr(k, j - k); k = j+1; subArray.push_back(ch); } if (j == len - 1) { string ch = line.substr(k, j - k+1); subArray.push_back(ch); } } return 0; }