1

私は最近、主に C++ で行われたプロジェクトを継承したので、これが私の最初の実際の露出です。begin()ベクトルのand で囲まれたループ内からベクトルの要素を消去する際に問題が発生する可能性があるかどうか疑問に思っていますend()

これが(本質的に)私がやろうとしてきたことです:

for (vector<double>::iterator i = distance.begin(); i < distance.end(); i++) {
    for (vector<double>::iterator j = i + 1; j < distance.end(); j++) {

        /* code to assemble *i, *j, and some other values, say *x & *y 
        (also iterators) assumed to be in the distance vector */

        vector< vector<double >::iterator remove;
        remove.push_back(i); remove.push_back(j);
        remove.push_back(x); remove.push_back(y);

        sort(remove.begin(), remove.end());

        for (int r = remove.size() - 1; r >= 0; r--) {
            distance.erase(remove.at(r));
        }
    }
}

私がテストしているものについては、これはうまくいくようです。ただし、これはまぐれによるものであり、このソリューションを使用すべきではないことを懸念しています。各ループの開始時にリセットされますかdistance.end()、それとも C++ は初期値をチェックするだけですか?

4

2 に答える 2

1

for-loop はループi < distance.end()ごとに評価されます。問題は にあります。distance.eraseこれは を無効iにするため、 の結果i++は未定義です。

于 2010-08-10T19:04:01.527 に答える
0

distance.end()ベクトルの現在の状態に対して常に正確です。

for()ループは、ループごとに常に条件を再評価します。

于 2010-08-10T19:00:16.983 に答える