2014-09-19 49 views
1

我正在写一个测试程序,并发现一个非常有趣的案例std::list的行为。std :: list是一个循环列表!等等,什么?

#include <list> 
#include <algorithm> 
#include <iostream> 

int main() 
{ 
    std::list<int> mylist; 
    std::list<int>::iterator iter; 
    for(int i=3; i<10; ++i){ 
     mylist.push_back(i); 
    } 
    iter = mylist.begin(); 
    iter--; 
    iter--; 
    std::cout<<*iter<< std::endl; 
    std::cout<<std::distance(mylist.end(), mylist.begin())<<std::endl; 
} 

输出是:

9 
1 

如果我没有记错的话,这种行为是有关循环清单。我从未见过论坛,书籍或讨论,其中提到标准列表是一个循环列表。我的GCC版本是4.1.2。 那我正确吗?是标准的std::list一个循环列表?

回答

14

不,std::list不是循环的。当你递减迭代器时,你的代码有未定义的行为。当您致电std::distance(mylist.end(), mylist.begin())时,它也有未定义的行为,因为mylist.begin()无法通过递增mylist.end()到达。

请注意,当您调用未定义的行为时,std::list看起来可能是循环的,因为“std :: list似乎是循环的”适合行为未定义时的允许行为范围。这个范围是任何行为。

+0

以及为什么结束和开始之间的距离是1? – 2014-09-19 11:04:30

+2

@EduardRostomyan:您对'std :: distance'的调用也是未定义的行为。 – 2014-09-19 11:05:18

+0

如何确定?因为当我在这种情况下计算向量的距离时,该函数返回一个负数。 – 2014-09-19 11:07:09

2

即使它是循环的在这个实现中你不必依赖它,因为这个属性不是标准保证的。 另外您的递减开始指针是未定义行为以及std::distance调用。

确实可能列表来实现,可能有你观察到的结果通过以下方式:

list 
    head --> listelem1 (or elEnd) 
    begin() return head; 
    end() return head->prev; 

listelem1   listelem2   listelem3   elEnd    
    ptr = d1   ptr = d2   ptr = d3   ptr = nullptr 
    next = le2   next = le3   next = elEnd  next = le1 
    prev = elEnd  prev = le1   prev = le2   prev = le3 

但是,这是到库的实现者,只要他遵循标准的接口和行为要求。

相关问题