Правильный способ разбить std :: 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 begin(ss); std::istream_iterator end; std::vector vstrings(begin, end); std::copy(vstrings.begin(), vstrings.end(), std::ostream_iterator(std::cout, "\n")); 

Вывод:

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

Демо-версия: http://ideone.com/d8E2G


строка, имеющая как запятую, так и пробел

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

Вывод:

 right way wrong way correct way 

Демо-версия: http://ideone.com/aKL0m

Удобным способом будет библиотека строковых алгоритмов 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); 

Если в строке есть пробелы и запятые, вы можете использовать функцию classа строк

 found_index = myString.find_first_of(delims_str, begin_index) 

в петле. Проверка на! = Npos и вставка в вектор. Если вы предпочитаете старую школу, вы также можете использовать C

 strtok() 

метод.

 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; } в 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”, “токен”) ==> [“1”, “2”, “3”]

я сделал эту настраиваемую функцию, которая преобразует линию в вектор

 #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; } 
  • Почему строки в C ++ обычно заканчиваются на «\ 0»?
  • Использовать строковые методы для поиска и подсчета гласных в строке?
  • Удалить все не «словарные символы» из String в Java, оставив акцентированные символы?
  • Сколько строковых объектов Java создано в коде String s = "abc" + "xyz" ;?
  • Какова цель выражения «new String (...)» в Java?
  • Макрос для конкатенации двух строк в C
  • Получение и удаление первого символа строки
  • C # разделите строку, но сохраните раздельные символы / разделители
  • Преобразование XmlDocument в String
  • Объединение вектора строк / символа
  • Вложенные круглые скобки
  • Давайте будем гением компьютера.