私が取り組んでいるいくつかのコードからこの小さなスニペットを直接取り出しました:
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
この出力を出すのか誰かがわかりますか?