为什么std:list :: iterator的std :: distance()在最后一个在第一个之前不返回负数?

问题描述 投票:2回答:2

std::distance给我std::list上的圆形距离,而不是相对距离。为什么?

 #include <list>                                                                 
 #include <iostream>                                                             
 #include <iterator>                                                             

 using namespace std;                                                            

 int main(){                                                                     
     list<int> derp = {1,2,3,4};                                                 
     auto begin = derp.begin();                                                  
     auto end = derp.end();                                                      
     end--;                                                                      
     cout << distance(end, begin) << endl;                                       
     cout << distance(begin, end) << endl;                                       
}             

运行此命令时,将发生以下输出:

2
3

我希望以下内容:

-3
3

为什么会这样?

c++ stl iterator undefined-behavior stdlist
2个回答
2
投票

您的代码具有未定义的行为。对于std::distance

[如果std::distance不是InputIt,则通过(可能重复)递增LegacyRandomAccessIterator无法从last到达first,则行为未定义。如果firstInputIt,那么如果无法从LegacyRandomAccessIterator访问last,并且无法从first访问first,则行为不确定。


0
投票

对于不满足end要求的迭代器,random access iterator返回必须将std::distance(第一个参数)增加等于std::distance(第二个参数)的次数。

您正在使用first,它没有随机访问迭代器。对于last,无论您递增std::list多少次,它都永远不会等于std::list。因此,行为是不确定的,其结果取决于标准库实现的细节。

© www.soinside.com 2019 - 2024. All rights reserved.