C++ 打印地图中的所有对 PhonebookEntry pb1(“奥拉诺曼”); pb1.添加(“主页”、“11234567”); pb1.添加(“工作”、“11065432”); cout
C++ 打印地图中的所有对 PhonebookEntry pb1(“奥拉诺曼”); pb1.添加(“主页”、“11234567”); pb1.添加(“工作”、“11065432”); cout,c++,map,C++,Map,getNumbers()正在返回映射的副本,而不是对它的引用。该副本在包含函数调用的表达式末尾被销毁,因此在循环过程中迭代器无效,对其执行任何操作都会产生未定义的行为 它应该看起来像: class PhonebookEntry{ private: std::string name; std::map<std::string, std::string> numbers; public: PhonebookEntry(std::string name) : nam
getNumbers()
正在返回映射的副本,而不是对它的引用。该副本在包含函数调用的表达式末尾被销毁,因此在循环过程中迭代器无效,对其执行任何操作都会产生未定义的行为
它应该看起来像:
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;}
};
有了这个更改,您的代码应该可以按预期工作 如果这是您的方法:
map<string,string> const & getNumbers() const;
^^^^^^^ ^^^^^
首先,它使用一个映射副本进行初始化。然后,将其与另一个副本的结束迭代器进行比较。您需要通过引用返回地图:
for(it = pb1.getNumbers().begin(); it != pb1.getNumbers().end(); ++it) { ... }
const std::map&getNumbers()const{return numbers;}
这里有两个独立的问题:
正如Mike在回答中解释的那样,
getNumbers()
返回的临时值在循环体中无效。是否返回引用或映射的副本?如果它返回一个副本,那么在您对它进行迭代之前它将被销毁,因此任何事情都可能发生。PhonebookEntry::getNumbers
的返回值是多少?如果它不返回引用,则您正在创建一个临时值,插入一个值,然后打印它,而不修改实际的电话簿。@MatthiasVallentin但他不是在用函数pb1.add()
?这是我的公共get metdog:std::map getNumbers()const{return numbers;}@Skogen:请通过提供PhonebookEntry
的相关代码来扩展您的示例,包括add
。即使副本继续存在,循环也会比较来自不同副本的迭代器,这是无效的…/PhonebookEntry.cpp:14:错误:它=((常数标准::map@Skogen:可能您只有const
版本?如果您不想公开可修改的引用,这很好,但在这种情况下,您需要将it
的类型更改为const\u迭代器
。
map<string,string> const & getNumbers() const;
^^^^^^^ ^^^^^
std::map<std::string, std::string> getNumbers() const {return numbers;}
for(it = pb1.getNumbers().begin(); it != pb1.getNumbers().end(); ++it) { ... }
const std::map<std::string, std::string>& getNumbers() const {return numbers;}
cout << pb1.getNumbers()["Home"] << endl;
for(it = pb1.getNumbers().begin(); it != pb1.getNumbers().end(); ++it) { ... }