我的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)有什么问题,但逻辑与玩具代码相同,因此我只能通过测试代码来解决这个问题。
答案 0 :(得分:0)
一个可能的问题是这些代码行:
int count=1;
submap.insert(pair<int,int&>(t,count));
您正在引用超出范围的本地变量。这是未定义的行为,可能是您遇到问题的原因。
考虑将您的hashmap更改为<int,int>
,除非您确实需要引用。如果需要引用,则需要确保所引用的对象不超出范围。
它在您的小测试代码中起作用的原因是test
和test2
保留在main
的生命周期范围内。
编辑:另一个问题是&#39; b&#39; - 您将新项目添加到本地副本submap
,因此它不会添加到主hash_map。我认为你可以在这里使用引用,所以hash_map会在适当的位置更新。:
hash_map<int, int&> &submap=tsMap.find(vr)->second;
--------------------^