首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bizzare std::distance输出

Bizzare std::distance输出
EN

Stack Overflow用户
提问于 2012-07-05 01:51:02
回答 1查看 462关注 0票数 0

我直接从我正在编写的一些代码中提取了这个小片段:

代码语言:javascript
复制
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;

它给出了以下输出:

代码语言:javascript
复制
dist1: 0
dist2: 2
dist3: 2

ignore是一个QSet<int>it1timeline_的迭代器(它的映射类型,键为int)。正如您所看到的,it1从开头开始(这是正确的),然后控制进入while循环,其中迭代器向后移动1;但是,不是std::distance是-1,而是2!在这两者之间发生的所有事情都是使用密钥的副本来检查QSet是否包含相同的int

使用调试器,我可以确认timeline_在两个dist#输出之间不会改变(不管怎样,在代码中的这一点上只有一个线程在运行)。

有人能理解为什么std::distance会给出这样的输出吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-05 02:09:23

我不确定Qt在这方面的行为,但在标准库容器中,获取范围[container.begin(),container.end()]之外的迭代器是未定义的行为。我会假设在Qt中也是一样的,尽管我不确定。然而,即使不是这样,std::distance在非随机访问迭代器上的行为也是计算从第一个迭代器到最后一个迭代器所需的增量的数量,因此如下所示:

代码语言:javascript
复制
std::distance(x,y)

其中yx之前,是未定义的行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11333572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档