2016-12-16 14 views
-1

このコードスニペットは、文字列、区切り文字(空白)、ベクトルを引数として受け取り、区切り文字に従って文字列を分割してベクトルに格納します。私はpush_backを使うとベクトルに何も格納していませんが、[]演算子を使うと動作します。誰かがpush_backが動作しない理由を説明できますか?ベクトル文字列push_backがC++で動作しません

void split(const string & input,char delim,vector<string> & elems){ 
    stringstream ss; 
    ss.str(input); 
    string item; 
    int i = 0; 
    while(getline(ss,item,delim)){ 
     //elems.push_back(item); 
     elems[i] = item; 
     i++; 
    } 
} 

int main(){ 
    char delim = ' '; 
    vector<string> item(2); 
    string input; 
    getline(cin,input); 
    split(input,delim,item); 
} 
+3

「作業していない」とはどういう意味ですか?私はあなたの 'elems'配列が関数の入力時に空ではないと推測します。 'std :: vector elems(100);'などで宣言しているので、 'split()'コードは101番目以降の要素に対して 'push_back()'を実行します。 –

+0

私はpush_front()を使うべきですか? – user1762571

+0

いいえ、スペースを割り当てないでください。 –

答えて

3

あなたには、いくつかの大きさ(N)とのベクトル事前に割り当てられている場合は、その後、プッシュバック(項目)は、インデックスにある項目を置くnと、さらに大きなサイズにベクトルのサイズを変更します。期限切れの文字列カウントを知っている場合は、とにかくサイズnの割り当て後にelems[i] = item;を使用する必要があります。

カウントがわからないが、いくつかのnより大きくなることがわかっている場合は、事前に割り当てないでください。 main機能でelems.push_back(item);

0

を使用する代わりに、RESERVE elems.reserve(n);

といくつかのメモリはその後、

vector<string> item; 


vector<string> item(2); 

から項目の宣言を変更し、splitを変更してください使用する関数push_back

void split(const std::string & input,char delim, std::vector<std::string> & elems){ 
    std::stringstream ss; 
    ss.str(input); 
    std::string item; 
    int i = 0; // no more required unless for some other purpose 
    while(getline(ss,item,delim)){ 
     elems.push_back(item); 
     //elems[i] = item; 
     i++; // no more required 
    } 
} 
+0

iを削除します。それはもはや必要ではありません。 – dmg

+0

@dmg:はい私は同意しますが、その意図は完全には分かっておらず、問題に直接関係していないため、残しました。 – elimad

+0

@elimadあなたが言っていることを理解していますが、ベクトル item(2)を持っていても何が問題なのでしょうか?それは要素として空文字列を持つサイズ2のベクトルを作成し、その後は最後に文字列を押し続けます。それはうまくいかない? – instance

関連する問題