2017-06-03 5 views
-4

pendant que je me débrouillais avec std :: list en C++ j'ai utilisé std :: advance pour accéder aux éléments aléatoirement. Mais std :: advance ne fonctionne pas comme prévu. Le code est comme indiqué ci-dessous.std :: avance en C++ ne se comporte pas correctement

#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<<" "; 
} 

la sortie i est reçu 0 0 2 mais ne doit pas être la sortie 0 1 3

Répondre

2

Vous obtenez le iterator avant d'avoir rien ajouté à la liste. La ligne

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

est équivalent à

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

t continue de pointer vers la fin de la liste, même après avoir ajouté les éléments à la liste. Par conséquent, la première ligne tente de déréférencer l'itérateur

cout<<*t<<" " 

cause un comportement indéfini. Tout peut arriver après cela. Il ne sert à rien d'essayer de donner un sens à la sortie du programme après cela. Pour résoudre le problème, vous devez obtenir l'itérateur après avoir ajouté les éléments à la liste.

#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<<" "; 
} 

sortie:

0 1 3