Правильный способ разбиения std::string на вектор <string>

Возможный дубликат:
Как разбить строку?

Каков правильный способ разбить строку на вектор строк. Разделитель - это пробел или запятая.

Ответ 1

Для разделенных пробелом строк вы можете сделать это:

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


строка с запятой и пробелом

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

Ответ 2

Удобный способ: ускорить библиотеку строковых алгоритмов.

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

Ответ 3

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

found_index = myString.find_first_of(delims_str, begin_index) 

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

strtok() 

метод.

Ответ 4

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

Blockquote

split ( "1,2,3", "," ) == > [ "1" , "2" , "3" ]

split ( "1,2,", "," ) == > [ "1" , "2" , ""]

split ( "1token2token3", "токен" ) == > [ "1" , "2" , "3" ]

Ответ 5

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

#include <iostream>
#include <vector>
#include <ctime>
#include <string>

using namespace std;

int main(){

    string line;
    getline(cin, line);
    int len = line.length();
    vector<string> 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;
}