2011-07-26 6 views
0
unsigned int j = 0; 
    openListIterator = openListVector.begin(); 
    while (exitPointDetailsVector[lowestWeightedPointInOpenList.pointId].branchesVector[m].connectedExitPoint >= openListVector[j].pointId) 
      && (openListIterator <= openListVector.end())) 
    { 
     // Move the iterator. 
     openListIterator++; 
     // Move the index. 
     j++; 
    } 

    // Insert in the vector in the required position. 
    listStruct objOpenListStruct; 
    objOpenListStruct.pointId  = exitPointDetailsVector[lowestWeightedPointInOpenList.pointId].branchesVector[m].connectedExitPoint; 
    objOpenListStruct.weight  = exitPointDetailsVector[lowestWeightedPointInOpenList.pointId].weight + exitPointDetailsVector[lowestWeightedPointInOpenList.pointId].branchesVector[m].distance; 
    objOpenListStruct.parentPointId = exitPointDetailsVector[lowestWeightedPointInOpenList.pointId].exitPoint; 

    ***********openListVector.insert (openListIterator, objOpenListStruct); 

このコードはforループの下にあります。 しかし、私はイテレータの初期化を適切に行いましたが、まだ星印された行にセグメンテーションフォルトが発生しています。ベクターに挿入する

ヒント声明openListIterator <= openListVector.end()

+0

ループをポストできますか? –

+2

まず、ベクトルの間に要素を挿入したい場合、このコンテナは確かに良いオプションではありません。ベクトルは最後にデータを追加する方が効率的です。また、データを挿入すると、以前に取得されたイテレータと再割り当てが無効になります。 dequeまたはlistを間に挿入することをお勧めします – Arunmu

+2

サイドノート:ソートされたコレクションを維持しようとしているようで、セットを使用した方がコードははるかに簡単です。 (パフォーマンスについて本当に心配しない限り) – zvrba

答えて

2

あなたがopenListIterator == openListVector.end()に達した場合、その後、あなたは、セグメンテーションフォルトを持っているつもりだが、コードがopenListIterator++に達したときに、あなたのイテレータが「バウンドの外」になるので

openListIterator != openListVector.end()

1

を試してみてくださいI影響何ができるか疑問に思う:それは十分かもしれないので、しばらく節の最初の部分で、あなたは、openListIteratorを使用していない、実際に

 && (openListIterator <= openListVector.end())) 

をそのループI openListIteratoropenListVector.end()の場合は増加し、その後増加します。したがって、挿入を行うと、セグメンテーションフォルトが発生します。

セグメンテーションフォルトが発生している場合は、この状態を確認できますか?

これが問題の原因である場合は、代わりに使用することができます:ここで

 && (openListIterator < openListVector.end())) 
+0

!=を付けることはsegfaultを解決しました。ありがとうございます。 –

+0

あなたが正しく、 '<'も働いています。 –

+1

私の答えとupvotingをチェックしてくれてありがとう! – sergio

2

がヒントです。あなたはイテレータに=演算子<を使用することはできません。

openListIterator <= openListVector.end() 

ので、あなたのイテレータはすべての後に良好ではないかもしれません。

+0

これは、構文エラーまたは警告する必要がありますか?とにかく、!=、<がバグを解決しました。ありがとう。 –

+1

@Anisha Right。悪い言葉遣い。 「できない」のではなく、「しないでください」 –

+2

@VJoはい、いいえ。 "Can not"一般的には、 '<='はランダムアクセスイテレータでのみ有効です。ループの標準的なイディオムは '!='を使用するので、常に "しないでください"。 –

2

私の直接のアドバイスは:それをしないでください。ソートされた順序でアイテムのコレクションを維持する場合は、おそらくstd::setを使用するべきです(挿入が比較的珍しい場合を除きます)。ソートされたベクトルを使用する場合は、ソートされたベクトルを利用することもできますし、バイナリ検索を使用して挿入ポイントを見つけることもできます(たとえば、std::lower_bound)。

コレクションの最後に追加/追加したいときに、無効なイテレータが発生しているようです。これ(他の問題の中でも)は、パッケージ化された検索アルゴリズム(またはstd::setまたはstd::multiset)を使用して自動的に処理されます。

+0

ありがとう、私はセットで見ていきます。 –

関連する問題