我已经从我正在处理的一些代码中直接看了这个小片段:
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
是QSet<int>
,it1
是timeline_
的迭代器(它的地图类型的键为int
)。正如你可以看到it1
从头开始(这是正确的),然后控制进入while循环,迭代器向后移动一个;但是std :: distance不是-1,而是2!发生在中间的所有内容都是密钥的副本,用于检查QSet
是否包含相同的int
。
使用调试器我可以确认timeline_
在两个dist#
输出之间没有变化(无论如何,代码中只有一个线程正在运行)。
有谁可以看到为什么std::distance
会提供此输出?
答案 0 :(得分:1)
我不确定Qt的行为,但在标准库容器中,获取范围[container.begin(),container.end()]
之外的迭代器是未定义的行为。我认为它在Qt中是一样的,虽然我不确定。但是,即使不是这样,std::distance
对非随机访问迭代器的行为是计算从第一个迭代器到最后一个迭代器所需的增量的数量,所以这个: / p>
std::distance(x,y)
其中y
位于x
之前,是未定义的行为。