2012-04-19 5 views
0

私は以下の関数を呼び出すときに、入力をベクトルに追加しますが、ベクトルに6つの余分なセルが一貫して追加されます。なぜそれが起こっているすべてのアイデアですか?C++:ベクトルが予期しないデータを取得する

これは、関連する機能である:FUNCを呼び出すメインプログラムの

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ではなく)

出力が期待されます。入力の順に入力からの単語になります。

+2

コードフラグメントの意図が不明なため、あなたの質問は不明です。あなたが持っているエラーを示す**完全**、**短い**サンプルプログラムを提供してください。その短いプログラムをコピーしてあなたの質問に貼り付けてください。期待どおりの出力と、実際に観察した出力を提供してください。詳細はhttp://sscce.orgを参照してください。 –

+0

あなたが期待している以上に6つの要素があることを意味しますか?もしそうなら、いくつかの入力と出力の例を掲載することができます(そして、あなたが見ているものを再現できるように、できれば短いコンパイル可能なプログラムが望ましいでしょうか)。あるいは、 'vec1.capacity()'が 'vec1.size()'よりも大きいということですか?これは 'push_back()'を使うと予想されます。ベクトルは、必要な再配分の数を減らすために倍率によって増加します。 –

+0

私はちょうどあなたの更新を見ました。私はすでに述べたこと以外は何の問題も見ません。 words_vecとwords_vecrefが同じであることは確かですか?whileループではwords_vecrefを使用し、最後にwords_vecを使用します。 – BertR

答えて

2

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

これらの中にいくつかの空の文字列whileループの内側)。 これらの空文字列は、テキストの途中でも発生します。

これは、元に戻ったときに実際にテキストが出現した場所をテストしないためです。 これは、whileループとwhileループの後にpush_backを呼び出す前にtemp_strが空でないかどうかをテストすることで解決できます。

+0

私はコードを修正するための最も可能なオプションを私に聞こえるあなたのsuggstionに従ったが、私はtemp_strが空であるかどうかをチェックしているとき、それは無限ループに入ります。どうして?いくつかのコード:if(!temp_str.empty()) { input_word.word = temp_str; vec1.push_back(input_word); temp_str.clear(); } – adamco

+1

まだ消去を行う必要があります。さもなければあなたの位置は増加しません。今私はそれについて考えているのですが、どうしてあなたは実際に消去するのですか(それはローカル変数であり、外部を変更しないので実際にはわかりません)、++を使って位置を増やすだけではありません; – BertR

0

あなたは、ループ内で

vec1.push_back(input_word); 

を呼び出します。

1

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

容量が1つ増えてそれぞれ新しいpush_backになると、大量のオーバーヘッドが発生します。

+0

'push_back'ごとにサイズが1ずつ増加します。容量はさらに増えるかもしれませんが、私はそれがここの問題だとは思わないのです。 – interjay

+0

@interjay "しかし、一貫して6つの余分な細胞がベクターに追加されます"他に何があるのでしょうか? –

+0

質問は明確ではありませんが、私は 'push_back'はOPが呼び出すことを期待している時間とは呼ばれないと仮定します。 – interjay

0

余分な要素を追加するのはこの機能ですか?デバッガでトレースしましたか?おそらく、電話の直前と直後の両方でベクトルcapacity()ではなくsize()をチェックしていると思われますか?特殊文字が入力文字列にない場合はどうなりますか?

あなたのelseブロックには、ベクターにプッシュされたオブジェクトにブランクtemp_strが割り当てられている可能性があります。多分これには何か関係がありますか?

関連する問題