C ++ map迭代器跳转元素

时间:2013-01-13 03:22:21

标签: c++ map insert iterator

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

为什么呢? 谢谢!

3 个答案:

答案 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迭代地图。