在地图中打印所有对

Sko*_*gen 0 c++ map

PhonebookEntry pb1("olaNormann");
pb1.add("Home","11234567");
pb1.add("Work","11065432");
cout << pb1.getNumbers()["Home"] << endl;
cout << pb1.getNumbers()["Work"] << endl;

map<string,string>::iterator it;
for(it = pb1.getNumbers().begin(); it != pb1.getNumbers().end(); ++it){
    cout << (*it).first << ": " << (*it).second << endl;
}
Run Code Online (Sandbox Code Playgroud)

我使用前两个cout来确保正确添加两对.代码将使用标签Home和Work打印出前两个数字,但无法在for循环中打印这两个数字.for循环只打印出"Home:11234567".谁能明白为什么?下面是我的头文件,其中实现了相关方法.

class PhonebookEntry{
private:
    std::string name;
    std::map<std::string, std::string> numbers;
public:
    PhonebookEntry(std::string name) : name(name){}
    std::map<std::string, std::string> getNumbers() const {return numbers;}

    void add(const std::string label,const std::string number){numbers[label] = number;}
};
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 6

getNumbers()正在返回地图的副本,而不是对它的引用.该副本在包含函数调用的表达式的末尾被销毁,因此在循环期间迭代器无效,并且对它执行任何操作都会给出未定义的行为.

它应该看起来像:

map<string,string> & getNumbers();
                   ^
Run Code Online (Sandbox Code Playgroud)

其中&表示参考.提供const过载也是礼貌的:

map<string,string> const & getNumbers() const;
                   ^^^^^^^              ^^^^^
Run Code Online (Sandbox Code Playgroud)

通过这种更改,您的代码应该按预期工作; 看示威.