2012-03-07 13 views
2
void insert_string(std::vector<std::string> & strings, const std::string &s) 
{ 

    std::vector<std::string>::iterator it=lower_bound(strings.begin(),strings.end(),s); 
    if(strings.size()>0) std::cout<<*it<<" is found\n"; // **** 
    strings.insert(it,s); 
} 

この機能を使用しようとすると、最初の挿入がうまくなります。 2番目の挿入は "[firststring]が見つかりました"と出力し、segfaultを出力します。 if/cout行をコメントアウトすると、繰り返し呼び出すことができ、segfaultは発生しません。C++:なぜこのベクトルイテレータsegfaultを逆参照していますか?

私はまたstd::string tmp=*it;のようなことをやってみましたが、その行でsegfaultします。印刷は大したことではありませんが、私が実際にやっていることは、lower_boundで見つかった位置の文字列が挿入しようとしている文字列と同じかどうかを確認することです(つまり、if(*it==s)、 2つの例)。

私はここで何が欠けていますか?

ありがとうございます!

+1

確かに 'if(it!= strings.end())std :: cout << * it <<"が見つかりました\ n ";'? – Flexo

+0

申し訳ありませんが、「見つかりました」という単語を使用してはいけません。イテレータが最後に終わった値を印刷したいだけで、文字列 's'が実際にこのベクトルで見つかったことを暗示しようとしません(これは最終的に私がやりたいことですが)。 – Joseph

答えて

6

it == strings.end()が印刷されていない場合は、条件を確認してください。これにより問題が発生する可能性があります。チェックしようとしている文字列が文字列のベクトルに含まれていますか?

+1

ああ、これはまさに問題です。挿入するとき、私は新しい文字列が既に文字列のベクトルに入っているかどうかわからない。実際には、私はそれを追加したくないです。イテレータがベクターの終わりであるかどうかを確認するために追加すると、私の問題が解決されました。ありがとう! – Joseph

関連する問題