【问题标题】:C++ map iterator jump elementsC++ 映射迭代器跳转元素
【发布时间】:2013-01-13 03:22:20
【问题描述】:

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

为什么? 谢谢!

【问题讨论】:

    标签: c++ map insert iterator


    【解决方案1】:

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

    【讨论】:

    • 好的,但是...为什么?我有同一张地图的两个副本...begin() 和 end() 在两个副本中返回的值不同?
    【解决方案2】:

    您多次致电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 )
    {
    

    我假设您需要一份副本。

    【讨论】:

    • 我不明白..我有同一张地图的两个副本...begin() 和 end() 在两个副本中返回的值不同?
    • @user1973451 - 在您的问题中,您的函数 getList 构造了地图的副本。您使用不同的副本来初始化迭代器并在它到达末尾时进行计算。
    【解决方案3】:

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

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

    或者更好的 const 引用:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-15
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      相关资源
      最近更新 更多