Maneira correta de dividir um std :: string em um vetor

Duplicar Possível:
Como dividir uma string?

Qual é o caminho certo para dividir uma string em um vetor de strings. Delimitador é espaço ou vírgula.

Para strings separadas por espaços, você pode fazer isso:

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")); 

Saída:

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

Demonstração online: http://ideone.com/d8E2G


string que tem tanto vírgula quanto espaço

 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")); 

Saída:

 right way wrong way correct way 

Demonstração on-line: http://ideone.com/aKL0m

Uma maneira conveniente seria a biblioteca de algoritmos de strings do 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); 

Se a string tiver espaços e vírgulas, você poderá usar a function de class de string

 found_index = myString.find_first_of(delims_str, begin_index) 

em um loop. Verificando! = Npos e inserindo em um vetor. Se você preferir a velha escola, você também pode usar C’s

 strtok() 

método.

 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; } 

Bloco de citação

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

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

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

Eu fiz esta function personalizada que irá converter a linha para vetor

 #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; }