我直接从我正在编写的一些代码中提取了这个小片段:
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: 2ignore是一个QSet<int>,it1是timeline_的迭代器(它的映射类型,键为int)。正如您所看到的,it1从开头开始(这是正确的),然后控制进入while循环,其中迭代器向后移动1;但是,不是std::distance是-1,而是2!在这两者之间发生的所有事情都是使用密钥的副本来检查QSet是否包含相同的int。
使用调试器,我可以确认timeline_在两个dist#输出之间不会改变(不管怎样,在代码中的这一点上只有一个线程在运行)。
有人能理解为什么std::distance会给出这样的输出吗?
发布于 2012-07-05 02:09:23
我不确定Qt在这方面的行为,但在标准库容器中,获取范围[container.begin(),container.end()]之外的迭代器是未定义的行为。我会假设在Qt中也是一样的,尽管我不确定。然而,即使不是这样,std::distance在非随机访问迭代器上的行为也是计算从第一个迭代器到最后一个迭代器所需的增量的数量,因此如下所示:
std::distance(x,y)其中y在x之前,是未定义的行为。
https://stackoverflow.com/questions/11333572
复制相似问题