2017-06-03 127 views
-4

雖然我在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

回答

2

你所得到的迭代器之前,您已經添加任何東西到列表中。該生產線

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