2

我对 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

为什么?谢谢!

4

3 回答 3

4

在 for 循环中,您从 mappa 的 2 个单独副本中获取 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;
}
于 2013-01-13T03:26:12.173 回答
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 )
{

我假设您需要一份副本。

于 2013-01-13T03:28:23.737 回答
1

getList() 返回 mappa 的副本。您需要更改它以返回参考:

std::map<string,int>& getList()

甚至更好的 const 参考:

const std::map<string,int>& getList()

在后一种情况下,您将需要使用 const_iterator 来迭代地图。

于 2013-01-13T03:28:54.447 回答