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
为什么会这样?
您的代码具有未定义的行为。对于std::distance
[如果
std::distance
不是InputIt
,则通过(可能重复)递增LegacyRandomAccessIterator无法从last
到达first
,则行为未定义。如果first
为InputIt
,那么如果无法从LegacyRandomAccessIterator访问last
,并且无法从first
访问first
,则行为不确定。
对于不满足end
要求的迭代器,random access iterator返回必须将std::distance
(第一个参数)增加等于std::distance
(第二个参数)的次数。
您正在使用first
,它没有随机访问迭代器。对于last
,无论您递增std::list
多少次,它都永远不会等于std::list
。因此,行为是不确定的,其结果取决于标准库实现的细节。