Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;错误:指定只读位置“0”;在无序图(C+;+;)中_C++_Iterator_Unordered Map - Fatal编程技术网

C++ &引用;错误:指定只读位置“0”;在无序图(C+;+;)中

C++ &引用;错误:指定只读位置“0”;在无序图(C+;+;)中,c++,iterator,unordered-map,C++,Iterator,Unordered Map,我有一个笨拙的哈希表(特别是一个无序的_映射),其中包含int键和vectorgetI(d);//此处出错 } } } 我对C++是新的,所以没有什么是显而易见的。谢谢你的帮助 遵循蒂姆的建议 我已将上述代码的相关部分替换为以下内容: pimap::iterator piItr = phenotypeIs.find( thisP ); if ( piItr != phenotypeIs.end() ) { for ( int d = 0; d < NUM_DEMES;

我有一个笨拙的哈希表(特别是一个无序的_映射),其中包含
int
键和
vector
数据。我需要定期更新int的二维向量中的元素。没有内在的理由我不能,对吧?我切换到的一个较新的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
   }
 }
}
typedef std::tr1::无序映射>pimap;
载体<菌株*>活菌株;
pimap表型;
int NUM_DEMES=3;
...
向量<应变*>::常数迭代器lsItr;
对于(lsItr=liveStrains.begin();lsItr!=liveStrains.end();++lsItr){
int thisP=(*lsItr)->getypeotype();
pimap::迭代器piItr=epothemis.begin();
piItr=表型发现(thisP);
if(piItr!=is.end()){
对于(int d=0;dsecond)[此步骤].at(d)=(*lsItr)->getI(d);//此处出错
}
}
}
我对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
    }
pimap::迭代器piItr=epothemis.find(thisP);
if(piItr!=is.end()){
对于(int d=0;d&thisVec2=piItr->second;
向量&thisVec=thisVec2.at(此步骤);
int&ii=该向量在(d)处;
ii=(*lsItr)->getI(d);
//(piItr->second)[thistep].at(d)=(*lsItr)->getI(d);//这里有错误
}

这段代码编译时没有出现错误,并且运行正常。与Tim一样,我仍然不太明白为什么修复程序可以正常工作。错误以前出现在gcc版本4.1.2 20080704(Red Hat 4.1.2-44)中,但在gcc版本4.0.1(Apple Inc.build 5465)中没有出现。当我的期限不紧时,我会更仔细地剖析错误!

你确定每个一级向量中确实有
thistep+1
元素和每个二级向量中的
NUM\u 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 );
at()向内部向量返回一个迭代器,而不是对值的访问

 *(( piItr -> second )[ thisStep ].at( d ))

(*lsItr)->getI(d)
返回什么?(*lsItr)->getI(d)返回一个int(真的。)@Tim谢谢我弄错了:)不,
vector::at()
返回向量元素类型的引用或常量引用。当我用您建议的较长的“未打包”版本替换该行时,错误消失,并且运行正常。我将在一个小时左右对其进行广泛测试。非常感谢语法方面的帮助……这意味着我使用的内容存在语法问题最初是ad。(有一次,我有一个旧编译器不能处理没有指向某个地方的迭代器声明,所以我习惯于将它们赋给.begin()奇怪的是,就实际调用的方法和运算符而言,它应该是100%相同的。很可能您在g++或其STL中发现了一个错误。您可以一步一步地再次折叠它以尝试找到问题,但为了清楚起见,最好还是将其展开。
( piItr -> second )[ thisStep ].at( d )
 *(( piItr -> second )[ thisStep ].at( d ))