C ++中嵌套的hash_map操作似乎有不同的结果,因为我预期

时间:2017-03-19 06:52:38

标签: c++ hashmap nested

我的C ++很低,现在学习在STL中使用hash_map。当我在以下玩具代码中测试嵌套的hash_map时,似乎有效:

#include <hash_map>
#include <iostream>
using namespace std;
int main()
{
    cout<<"h4 h5"<<endl;
    hash_map<int,int&> h4;
    int temp=0;
    h4.insert(pair<int,int&>(0,temp));

    hash_map<int, hash_map<int,int&>> h5;
    h5.insert(pair<int, hash_map<int,int&>>(1,h4));
    hash_map<int, hash_map<int,int&>>::iterator h5_itor=h5.find(1);
    h5_itor->second.find(0)->second++;
    h5_itor->second.find(0)->second++;
    h5_itor->second.find(0)->second++;
    cout<<h5.find(1)->second.find(0)->second<<endl;
    int temp2=7;
    h5.find(1)->second.insert(pair<int,int&>(3,temp2));
    h5.find(1)->second.find(3)->second+=100;

    hash_map<int, hash_map<int,int&>>::iterator h5_itor2;
    for(h5_itor2=h5.begin();h5_itor2!=h5.end();h5_itor2++)
    {
       hash_map<int,int&> submap=h5_itor2->second;
       hash_map<int,int&>::iterator submap_itor;
       for(submap_itor=submap.begin();submap_itor!=submap.end();submap_itor++)
       {
            cout<<submap_itor->first<<" -> "<<submap_itor->second<<endl;
       }
    }
    return 0;
}

结果是(在Visual C ++ 2010和Linux中): h4 h5 3 0 - &gt; 3 3 - &gt; 107

但在我的实际应用中,如下所示:

int main()
{
    int Rq=40;
    int T=10;
    hash_map<int, hash_map<int, int&>> tsMap;
    for(int j=0;j<Rq;j++)
    {
        cout<<">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #"<<j<<endl;
        //int vr=rand()%15;
        for(int t=1;t<=T;t++)
        {
            if(true)
            {
                double ran=rand()/(RAND_MAX*1.0);
                int vr=rand()%5;
                if(tsMap.find(vr)!=tsMap.end())
                {
                    if(tsMap.find(vr)->second.find(t)!=tsMap.find(vr)->second.end())
                    {
                        cout<<"case a) update "<<vr<<" -> "<<t<<" ->* "<<tsMap.find(vr)->second.find(t)->second;
                        tsMap.find(vr)->second.find(t)->second++;
                        cout<<" to "<<tsMap.find(vr)->second.find(t)->second<<endl;
                    }
                    else
                    {
                        //hash_map<int, hash_map<int, int&>>::iterator tsMap_itor=tsMap.find(vr);
                        hash_map<int, int&> submap=tsMap.find(vr)->second;
                        int count=1;
                        submap.insert(pair<int,int&>(t,count));
                        cout<<"case b) insert "<<vr<<" -> "<<t<<" ->* "<<tsMap.find(vr)->second.find(t)->second<<endl;
                    }
                }
                else//
                {
                    hash_map<int, int&> submap;
                    int count=1;
                    submap.insert(pair<int,int&>(t,count));
                    tsMap.insert(pair<int, hash_map<int, int&>>(vr,submap));
                    cout<<"case c) insert "<<vr<<" ->* "<<t<<" -> "<<tsMap.find(vr)->second.find(t)->second<<endl;
                }
            }
        }
    }
    return 0;
}

代码终止时没有任何建议(即打印少于10行),案例b)(当然和案例a))从未执行过。我怀疑案例b)有什么问题,但逻辑与玩具代码相同,因此我只能通过测试代码来解决这个问题。

1 个答案:

答案 0 :(得分:0)

一个可能的问题是这些代码行:

int count=1;
submap.insert(pair<int,int&>(t,count));

您正在引用超出范围的本地变量。这是未定义的行为,可能是您遇到问题的原因。

考虑将您的hashmap更改为<int,int>,除非您确实需要引用。如果需要引用,则需要确保所引用的对象不超出范围。

它在您的小测试代码中起作用的原因是testtest2保留在main的生命周期范围内。

编辑:另一个问题是&#39; b&#39; - 您将新项目添加到本地副本submap,因此它不会添加到主hash_map。我认为你可以在这里使用引用,所以hash_map会在适当的位置更新。:

hash_map<int, int&> &submap=tsMap.find(vr)->second;
--------------------^