2017-12-08 17 views
0

ベクトルがあります。すべての要素を比較し、要素が1つ残るまで要素を削除する必要があります。私はいくつかのループを繰り返しますが、いくつかの要素を削除すると、「ベクトルの添え字が範囲外です」ということになります。 これは、要素を削除し、ベクトルの空の領域を反復しようとしているためですが、ループ条件がそれを処理すると思ったからです。反復処理中にベクトルから要素を削除する方法

基本的には、シェイプを保存していて、シェイプが重なるまでシェイプします。あなたは無効なインデックスの問題に実行して、または、添付アイテムを欠落リスクとしてLOOP-反復/の配列またはベクトルの大きさを変更することは避けるべき、典型的

while (shapeGrid.size() > 1) 
{ 
    for (int i = 0; i < shapeGrid.size(); i++) 
    { 

     for (int x = 0; x < shapeGrid.size(); x++) 
     { 

      if (conditionmet()) 
      { 
        shapeGrid.erase(shapeGrid.begin() + x); 
        cout << "Shape Removed" << endl; 

      } 

      if (conditionmet()) 
      { 
        shapeGrid.erase(shapeGrid.begin() + x); 
        cout << "Shape Removed" << endl; 


      } 

     } 
    } 
    for (int i = 0; i < shapeGrid.size(); i++) // Shuffle positions 
    { 
     shapeGrid[i].x = (rand() % 100) + 1; 
     shapeGrid[i].y = (rand() % 100) + 1; 
    } 
} 
+0

'conditionmet()'ブロックを間違ってコピー・ペーストしましたか? – frslm

+0

提案:タスクの簡素化を検討してください。 ** integeresの**配列**(ベクトルではない)があり、すべてのものを削除する必要があるとします。それについてどうやって行きますか?これは学習者のための非常に良いアルゴ問題ですが、あなた自身で解決策に来ることはあなたには良いことです。 – SergeyA

+0

ループ中にベクトルを変更する場合は、 '.size()'の代わりにイテレータを使用してください。 –

答えて

0

()(conditionmetを想定正しいです)終わり。

ベクトルオブジェクトを反復処理するときに要素を削除するのではなく、反復処理で新しいオブジェクトを作成して、保持したいオブジェクトをコピーする必要があります。その後、ループの後に、元のベクトル変数を新たにプルーニングされたものにリセット/置換する。

+1

'std :: remove'を使用して項目を削除します。 –

関連する問題