Правильный способ разбить std :: string на вектор
Возможный дубликат:
Как разбить строку?
Каков правильный способ разбить строку на вектор строк. Разделитель – это пробел или запятая.
- Преобразование строки в целое число на Android
- Нечувствительность к регистру std :: string.find ()
- путаница о java Строковый литеральный пул и конкатенация String
- Подсчитайте слова в R
- Java String.equals против ==
- Проверка того, что строка содержит только буквы в C #
- Использование getline () в C ++
- Как добавить новые элементы в массив?
- Извлечение числа из строки в Python
- Заменить специальные символы в XSLT
- Как преобразовать строку Java в байт ?
- Как динамически создавать переменные в Java?
- чтение строки с пробелами с помощью sscanf
Для строк, разделенных пробелами, вы можете сделать это:
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){ vector 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; } vector
split(string str, string token){ vector 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; }
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; }