映射迭代器跳转元素

C++ map iterator jump elements

本文关键字:元素 迭代器 映射      更新时间:2023-10-16

我有一个关于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

为什么?谢谢!

在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;
}

您多次呼叫getList。每次都使用复制构造函数创建一个新的map。

你这样做:

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 )
{

我想你需要一份副本。

getList()返回mappa的副本。您需要将其更改为返回一个引用:

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

或者最好是const引用:

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

对于后一种情况,您需要使用const_iterator来遍历映射。