c ++ map iterator不是从第一项开始的

时间:2017-12-20 02:58:49

标签: c++ dictionary 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但结果是一样的。可能是造成这个问题的原因是什么?

以下是Noeud的课程:

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

1 个答案:

答案 0 :(得分:3)

getRoutes()按值返回,这意味着origine->getRoutes()返回的是temporary,它将在完全表达后被销毁。在it悬空后,任何取消引用都会导致UB

您可以使用命名变量来避免此问题。 e.g。

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

请注意,出于同样的原因,在for循环中origine->getRoutes()被调用两次并返回两个不相关的对象。从它们获得的迭代器是不兼容的,比较它们是不正确的。