2017-12-20 20 views
1

반복기가 첫 번째 항목에서 시작하지 않는 몇 가지 이유 때문에지도를 반복하려고합니다.C++ map iterator가 첫 번째 항목에서 시작하지 않습니다.

const Noeud* origine = &noeuds.at(nomorigine); 
map<string, Noeud>::iterator it; 
origine->seeRoutes(); //Prints n5: n4 n6 
it = origine->getRoutes().begin(); 
cout<<it->first<<endl; //Prints n4. 
for(it = origine->getRoutes().begin(); it != origine->getRoutes().end(); it++){ 
    cout<<it->first<<endl; //Prints n6. 
} 

void Noeud::seeRoutes() const{ 
    cout<<getNom()<<": "; 
    for(auto it = routes.begin(); it != routes.end(); it++){ 
     cout<<it->first<<" "; 
    } 
    cout<<endl; 
} 

나는 auto을 사용해 보았지만 그 결과는 같습니다. 이 문제의 원인은 무엇일까요? 값을 기준으로

class Noeud{ 
    public: 
    string getNom() const; 
    void setNom(const string& nom); 
    void ajouterRoute(const string& nomRoute, const Noeud noeud); 
    map<string, Noeud> getRoutes() const; 
    void seeRoutes() const; 

    private: 
    string nom; 
    map<string, Noeud> routes; 
}; 
+0

for 루프에서 ++을 사용하지 않는 이유는 무엇입니까? – Davar

+0

와 비슷한 오류와 답변을 [https://stackoverflow.com/questions/30041907/can-i-use-nested-loops-with-vectors-in-cpp]. – PaulMcKenzie

+0

@Davar 나는 ++와 it ++ 사이에 아무런 차이가 없다고 생각했다. for 루프에서 pre-increment하는 것이 항상 좋은가요? –

답변

3

getRoutes() 반환 origine->getRoutes() 반환 풀 발현 후 파괴 될 temporary 무엇을 의미 : 여기

는 Noeud을위한 클래스입니다. it이 매달려진 후에는 그것에 대한 참조가 없으므로 UB이됩니다.

이 문제를 피하기 위해 명명 된 변수를 사용할 수 있습니다. 예 :

map<string, Noeud> m = origine->getRoutes(); 
it = m.begin(); 
... 

그리고 루프 origine->getRoutes() 두 번 호출과 두 개의 관련이없는 객체를 반환에서, 같은 이유로 점에 유의. 그 (것)들에게서 얻은 반복자는 양립하지 않으며, 그 (것)들을 비교하는 것은 형체가 나쁘다.

+0

작동합니다. 고맙습니다. 따라서이 문제를 피할 수있는 유일한 방법은 루프 앞에 이름이 지정된 변수에 맵을 저장하는 것입니다. –

+0

@AnthonyGauthier 디자인에 따라 'getRoutes'를 참조별로 반환하도록 변경하면이 문제도 해결 될 수 있습니다. 유효한 참조를 반환하도록하십시오. – songyuanyao