0

私が取り組んでいるいくつかのコードからこの小さなスニペットを直接取り出しました:

KeyIter it = timeline_.lowerBound( frame );
if ( timeline_.isKeyAtFrame( frame ) ) {
    ++it;
}

KeyIter it1 = it - 1;
cout << "dist1: " << std::distance( timeline_.begin(), it1 ) << endl;
while ( ignore.contains( it1.key() ) ) {
    cout << "dist2: " << std::distance( timeline_.begin(), it1 - 1 ) << endl;
    if ( std::distance( timeline_.begin(), --it1 ) < 0 ) {
        break;
    }
}
cout << "dist3: " << std::distance( timeline_.begin(), it1 ) << endl;

次の出力が得られます。

dist1: 0
dist2: 2
dist3: 2

ignoreはaQSet<int>it1あり、はのイテレータですtimeline_(キーがのマップタイプですint)。ご覧のとおりit1、最初から開始し(これは正しいです)、制御はwhileループに入り、イテレータが1つ後方に移動します。しかし、std :: distanceが-1である代わりに、それは2です!その間に発生するのは、キーのコピーを使用しQSetて、に同じが含まれているかどうかを確認することだけintです。

timeline_デバッガーを使用して、2つの出力間で変更がないことを確認できdist#ます(とにかく、コードのこの時点で実行されているスレッドは1つだけです)。

なぜstd::distanceこの出力を出すのか誰かがわかりますか?

4

1 に答える 1

1

これに対するQtの動作についてはよくわかりませんが、標準ライブラリコンテナでは、範囲外のイテレータを取得すること[container.begin(),container.end()]は未定義の動作です。よくわかりませんが、Qtでも同じだと思います。ただし、そうでない場合でも、std::distance非ランダムアクセスイテレータでの動作は、最初のイテレータから最後のイテレータまで取得するために必要な増分の数をカウントすることです。したがって、次のようになります。

std::distance(x,y)

yxにあるのは未定義の動作です。

于 2012-07-04T18:09:22.973 に答える