2017-05-05 17 views
3

文字列をトークン化してベクターに追加したいが、今できることは、以下に示すイテレータを使ってそれらにアクセスすることだけである。文字列反復子が指しているデータを文字列ベクトルに戻す方法

vector<string> ExprTree::tokenise(string expression){ 

    vector<string> vec; 
    std::string::iterator it = expression.begin(); 

    while (it != expression.end()) { 

     cout << "it test " << (*it) << endl; 
     vec.push_back(*it); // wrong! 
     it++; 
    } 

私は(10 + 10) * 5 を入れたときに、出力は私が欲しいものですが、どのように私は実際にベクトルにそれらを追加することができ

( 
1 
0 
+ 
1 
0 
) 
* 
5 

のですか?

答えて

1

charstd::string点の反復子は、そう*it直接std::vector<std::string>push_back EDすることができない、std::stringではなく、charこと。

あなたは

vec.push_back({*it});  // construct a temporary string (which contains *it) to be added 

またはその代わりにemplace_backを使用するように変更することができます。

vec.emplace_back(1, *it); // add a string contains 1 char with value *it 
0

私は間違えてはいけない場合は、スペースをプッシュしていないだろう、あなたのですか? textと文字列コンテナvecを必要とするtokeniseという関数を次のように作成します。

void tokenize(const std::string text, std::vector<std::string>& vec) { 
    for(auto &it : text) { 
    if(isspace(it) == false) { 
     vec.push_back(std::string(1,it)); 
    } 
    } 
} 

この関数を任意の名前で呼び出してください。実装は次のようにする必要があります。

std::vector<std::string> vec; 
std::string text = "10 + 10) * 5"; 
tokenize(text, vec); 
for(auto &it : vec){ 
    std::cout << it << std::endl; 
} 

出力は、希望どおりです。このコードにはcctypeヘッダーが必要です。

関連する問題