我有一个带有int
个密钥和vector< vector< int >>
数据的笨拙哈希表(特别是一个unordered_map)。我经常需要更新这个二维向量的元素。没有内在的理由我不能,对吧?一个较新的g ++编译器我转而抱怨在下面指定的行上分配了只读位置。
typedef std::tr1::unordered_map< int, vector< vector< int > > > pimap;
vector< Strain * > liveStrains;
pimap phenotypeIs;
int NUM_DEMES = 3;
...
vector< Strain * >::const_iterator lsItr;
for ( lsItr = liveStrains.begin(); lsItr != liveStrains.end(); ++lsItr ) {
int thisP = (*lsItr)->getPhenotype();
pimap::iterator piItr = phenotypeIs.begin();
piItr = phenotypeIs.find( thisP );
if ( piItr != phenotypeIs.end() ) {
for ( int d = 0; d < NUM_DEMES; d++ ) {
( piItr -> second )[ thisStep ].at( d ) = (*lsItr)->getI( d ); // error here
}
}
}
我是C ++的新手,所以没有什么是太明显了。谢谢你的帮助。
根据蒂姆的建议
我已将以上代码的相关部分替换为以下内容:
pimap::iterator piItr = phenotypeIs.find( thisP );
if ( piItr != phenotypeIs.end() ) {
for ( int d = 0; d < NUM_DEMES; d++ ) {
vector< vector< int > > & thisVec2 = piItr->second;
vector<int> & thisVec = thisVec2.at( thisStep );
int & ii = thisVec.at( d );
ii = (*lsItr)->getI( d );
// ( piItr -> second )[ thisStep ].at( d ) = (*lsItr)->getI( d ); // error was here
}
此代码编译时没有错误,似乎运行正常。像Tim一样,我仍然不太明白为什么修复有效。此错误先前出现在gcc版本4.1.2 20080704(Red Hat 4.1.2-44)中,但不出现在gcc版本4.0.1(Apple Inc. build 5465)中。当我没有在一个紧迫的期限内时,我会尝试更仔细地剖析错误!
答案 0 :(得分:1)
您确定每个第一级向量中都有thisStep + 1
个元素吗?每个第二级向量中都有NUM_DEMES
元素吗?
如果我没有正确读取,你实际上并没有分配给地图迭代器,所以我怀疑错误是在向量访问中。
将最后一个语句分解为多个语句可能会有所帮助,这样每个语句只能做一件事来缩小问题的范围。例如,
Strain* strain = *lsItr;
vector<vector<int> >& vv = piItr->second;
vector<int>& v = vv[thisStep];
int& i = v.at(d); // <-- My bet is that the error occurs here or the prev. line
i = strain->getI( d );
顺便说一下,piItr = phenotypeIs.begin();
在这里没有效果,可能只是:
pimap::iterator piItr = phenotypeIs.find( thisP );
答案 1 :(得分:-1)
( piItr -> second )[ thisStep ].at( d )
at()将迭代器返回到内部向量中,而不是访问该值。你想要的是
*(( piItr -> second )[ thisStep ].at( d ))