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

问题描述 投票:1回答:1

我试图迭代地图由于某种原因迭代器不从第一个项目开始。

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;
};
c++ dictionary iterator
1个回答
3
投票

getRoutes()按价值返回,这意味着origine->getRoutes()返回的是一个temporary,它将在完全表达后被销毁。在那之后it变得悬空,任何对它的解引用都会导致UB

您可以使用命名变量来避免此问题。例如

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

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

© www.soinside.com 2019 - 2024. All rights reserved.