我对std :: map结构有疑问: 此代码片段正常工作:
map<string,int> mappa;
int main(int argc, char** argv) {
mappa["b"]=1;
mappa["a"]=2;
for(std::map<string,int>::iterator it=mappa.begin();it!=mappa.end();++it )
{
cout<<it->first<<"\n";
}
return 0;
}
输出:
a
b
但如果我这样做:
map<string,int> mappa;
std::map<string,int> getList(){
return mappa;
}
int main(int argc, char** argv) {
mappa["b"]=1;
mappa["a"]=2;
for(std::map<string,int>::iterator it=getList().begin();it!=getList().end();++it )
{
cout<<it->first<<"\n";
}
return 0;
}
我的输出只是
b
为什么呢? 谢谢!
答案 0 :(得分:4)
在for循环中,您将从2个单独的mappa副本中获取begin()和end(),因为getList()按值而不是引用返回。您需要更改getList()函数以通过引用返回。
符合预期的代码:
#include <iostream>
#include <string>
#include <map>
using namespace std;
map<string,int> mappa;
std::map<string,int>& getList() { // returning reference now
return mappa;
}
int main(int argc, char** argv) {
mappa["b"]=1;
mappa["a"]=2;
for(std::map<string,int>::iterator it=getList().begin();it!=getList().end();++it )
{
cout<<it->first<<"\n";
}
return 0;
}
答案 1 :(得分:1)
您多次致电getList
。每次使用复制构造函数创建新地图时。
你这样做:
std::map<string,int> myList = getList();
const std::map<string,int>::iterator myListEnd = myList.end();
for(std::map<string,int>::iterator myList.begin();it!=myListEnd;++it )
{
我假设你需要一份副本。
答案 2 :(得分:1)
getList()返回mappa的副本。您需要更改它以返回引用:
std::map<string,int>& getList()
甚至更好的const引用:
const std::map<string,int>& getList()
在后一种情况下,您需要使用const_iterator迭代地图。