0

ベクトル要素を消去するための簡単なルーチンの例を以下に示します。その位置は別のベクトルに格納されています。私はこの方法をしばらく使用してきましたが、最近になってエラーが発生しました: Expression: vector iterator + offset out of range.

erase() 呼び出しのパラメータ内にあるため、2 番目の部分を括弧で囲んでいなかったため、ベクトルの末尾近くの要素を消去するときに上記のエラーが発生することがあるという問題を発見したようです。

今、私は問題を特定して修正しました。以下の簡単なルーチンが実際に有効でエラーがないこと、および for ループ内でこの方法で erase() を呼び出しても問題ないことを誰かが確認できれば幸いです。

このルーチンは、最初から最後まで要素の位置を消去する場合にのみ機能することを認識しています。以下の私のコードを見てください:

vector<int> mynumbers;
mynumbers.push_back(4);
mynumbers.push_back(5);
mynumbers.push_back(6);
mynumbers.push_back(7); 

vector<int> delpositions;
delpositions.push_back(1);
delpositions.push_back(2);
delpositions.push_back(3);  

for(unsigned int i = 0; i < delpositions.size(); ++i)   
    mynumbers.erase(mynumbers.begin() + (delpositions[i] - i));

// Used To Be: delpositions[i] - i Which Caused The Error! Instead of: (delpositions[i] - i)
4

1 に答える 1

1

消去された要素の数によって「配置」を調整することで、正しいことを行います。「配置」が昇順でソートされていることを確認してください。

逆の順序 (最後から最初) で消去すると、もう少し効率的かもしれません。

私が検討します

vector result; 
result.reserve(mynumbers.size() - delpositions.size()); 
// copy valid positions to result 
mynumbers.swap(result)

より良い解決策

于 2013-08-16T12:11:07.687 に答える