把std :: string分成一个vector <string>的正确方法

可能重复:
如何分割一个string?

将string拆分为string向量的正确方法是什么? 分隔符是空格或逗号。

对于空格分隔的string,你可以这样做:

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

输出:

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

在线演示: http : //ideone.com/d8E2G


有逗号和空格的string

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

输出:

 right way wrong way correct way 

在线演示: http : //ideone.com/aKL0m

一个方便的方法是boost的stringalgorithm库 。

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

如果string同时包含空格和逗号,则可以使用string类函数

 found_index = myString.find_first_of(delims_str, begin_index) 

在一个循环中。 检查!= npos并插入一个向量。 如果你喜欢旧的学校,你也可以使用C的

 strtok() 

方法。

 vector<string> split(string str, string token){ vector<string>result; 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; } 

大段引用

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

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

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