0
          std::vector<struct::event>::iterator it;
          std::vector<struct::event>::iterator last=myvector.end();

          for (it=myvector.begin(); it<=last; it++){

            if(mysignal.declination<(*last).declination){

              if (mysignal.declination>=(*it).declination && mysignal.declination<(*(it+1)).declination){
                myvector.insert(it+1, mysignal);
                break;
              }
            }
            if (mysignal.declination>=(*last).declination){
              myvector.push_back(mysignal);
              break;
            }


            }

赤緯でソートされたイベントを含むmyvectorというベクトルがあります。ここで、mysignalをこのベクトルの適切な場所に追加します。しかし、if(mysignal.declination <(* last).declination)を参照するいくつかのイベントの後に、常にセグメンテーション違反が発生します。何が悪いのかわかりません。

4

3 に答える 3

2

あなたのループは間違っています、ドキュメントを読んでください:

コンテナの最後の要素に続く要素にイテレータを返します。この要素はプレースホルダーとして機能します。アクセスしようとすると、未定義の動作が発生します。

逆参照することはできませんend()。これは、コンテナーをオーバーランしたことを知る方法を提供するため、ループ条件はである必要がありit != myvector.end()last同様に間違っています。

于 2013-02-21T22:59:16.733 に答える
1

他の人が言っているように、C ++イテレータはハーフオープン間隔('[begin()...end())')を定義します。これは、他のほとんどの場合にもおそらく使用する必要があります。また、ベクトルからのイテレータで機能しますが、一般に、イテレータはサポートしていません <=(または<)。ループの標準的なイディオムは次のとおりです。

for ( auto current = container.begin();
        current != container.end();
        ++ current ) ...

(C ++ 11を信頼できない可能性が最も高い場合は、使用するのではなく、完全なイテレータタイプを書き出す必要があります auto。ただしauto、VCで動作するように見えるC++11の数少ないものの1つです。 ++11およびg++の最新バージョンを使用しているため、関係するターゲットがそれらだけであり、常に最新バージョンを使用していることを確認できる場合は、それを使用できます。)

また、ループ内のベクトルの最後の要素にアクセスする場合は、その要素myvector.back()への参照を返します。(myvector.back()ベクトルが空の場合は未定義の動作ですが、ベクトルが空の場合はループに入りません。)

于 2013-02-21T23:17:38.303 に答える
0

end()はコンテナの最後の要素を参照しないため、次のように条件を変更する必要があります。

for (it=myvector.begin(); it != last; it++){

修正する必要がある最後の間接参照である他の壊れたロジックもあります。

于 2013-02-21T22:45:55.760 に答える