std :: advance在C++中表现不正确

问题描述:

虽然我在C++中调用了std :: list,但我使用std :: advance来随机访问元素。但是std :: advance并不像预期的那样工作。如下所示。std :: advance在C++中表现不正确

#include <list> 
#include<iostream> 
#include<iterator> 
using namespace std; 
int main() 
{ 
list<int> i; 
typename list<int>::iterator t=i.begin(); 
i.push_front(0); 
i.push_back(1); 
i.push_back(2); 
i.push_back(3); 
cout<<*t<<" "; 
advance(t,1); 
cout<<*t<<" "; 
advance(t,2); 
cout<<*t<<" "; 
} 

我得到的输出是0 0 2 但不应输出为0 1 3

你所得到的迭代器之前,您已经添加任何东西到列表中。该生产线

typename list<int>::iterator t=i.begin(); 

相当于

typename list<int>::iterator t=i.end(); 

t继续指向列表的末尾添加的项目列表后还是一样。因此,第一行尝试取消引用迭代器

cout<<*t<<" " 

导致未定义的行为。之后会发生任何事情。在此之后试图理解程序的输出是毫无意义的。

要解决这个问题,您应该在将项目添加到列表后获取迭代器。

#include <list> 
#include<iostream> 
#include<iterator> 
using namespace std; 
int main() 
{ 
    list<int> i; 
    i.push_front(0); 
    i.push_back(1); 
    i.push_back(2); 
    i.push_back(3); 
    typename list<int>::iterator t=i.begin(); 
    cout<<*t<<" "; 
    advance(t,1); 
    cout<<*t<<" "; 
    advance(t,2); 
    cout<<*t<<" "; 
} 

输出:

0 1 3