0

以下の関数を呼び出すと、入力がベクターに追加されますが、常に 6 つの余分なセルがベクターに追加されます。なぜそれが起こっているのですか?

これは関連する関数です:

void seperate_words(string str1, vector<struct wordstype> &vec1)
{
    string temp_str;
    string::iterator is=str1.begin();
    wordstype input_word;
    while (is<str1.end())
    {
        if (((*is)!='-')&&((*is)!='.')&&((*is)!=',')&&((*is)!=';')&&((*is)!='?')&&((*is)!='!')&&((*is)!=':'))
        {
            temp_str.push_back(*is);
            ++is;
        }
        else
        { 
            input_word.word=temp_str;
            vec1.push_back(input_word);
            is=str1.erase(is);
            temp_str.clear();
        }
    }
    input_word.word=temp_str;
    vec1.push_back(input_word);
    temp_str.clear();
}

関数を呼び出すメインプログラムの関連する間隔は次のとおりです。

**while(end_flag==-1){
    cin>> temp_string;
    end_flag=temp_string.find(end_str);/*indicates whether the end sign is precieved*/
    seperate_words(temp_string,words_vecref);/*seperats the input into single words and inserts them into a vector*/
} 
int x=words_vec.size();
cout<<x<<" "<<std::endl;
for (vector<struct wordstype>::iterator p_it=words_vec.begin();p_it<words_vec.end();p_it++)
 {cout<<(*p_it).word<<" ";}**

例: 私は通りを歩いています。ベクトル サイズを 6 要素だけ (12 要素ではなく) 増やす必要があります。

出力が期待されます: 6 つのセルのみで、それぞれの oe には、エントリの順序で入力から単語が入力されます。

4

4 に答える 4

2

文字列の最後に 6 つの句読点がありますか? テキストが句読点で終わる場合、ベクトルに余分な空の文字列を追加します (while ループの外側で無条件にベクトルに追加するため)。

これらが複数ある場合は、空の文字列がいくつかあります (今回は while ループ内)。これらの空の文字列は、テキストの途中でも発生する可能性があります。

これは、プッシュバックするときに、実際にテキストに遭遇した場所をテストしないためです。while ループで push_back を呼び出す前と while ループの後に temp_str が空でないかどうかをテストすることで、これを修正できます。

于 2012-04-19T13:50:13.440 に答える
1

現在の容量ではそれ以上要素を保持できないベクターに要素を追加しようとすると、ベクターのサイズが変更されます。

容量が 1 ずつ増加すると、新しいpush_back, 膨大なオーバーヘッドが発生します。

于 2012-04-19T13:33:59.413 に答える
0

あなたが呼ぶ

vec1.push_back(input_word); 

ループ内。

于 2012-04-19T13:33:36.857 に答える
0

余分な要素を追加しているのはこの関数だと確信していますか? デバッガでトレースしましたか?おそらく、呼び出しの直前と直後の両方でベクトルsize()ではなくチェックしていますか? capacity()入力文字列に「特殊」文字が含まれていない場合はどうなりますか?

あなたのelseブロックではtemp_str、ベクトルにプッシュされたオブジェクトに空白を割り当てている可能性があることに気付きました。もしかしてこれが何か関係あるの?

于 2012-04-19T13:50:00.040 に答える