2

intキーとvector< vector< int >>データを含む厄介なハッシュ テーブル (具体的には、unordered_map) があります。この int の 2 次元ベクトルの要素を定期的に更新する必要があります。私ができないはずの本質的な理由はありませんよね?私が切り替えた新しい 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. ビルド 5465) では表示されませんでした。締め切りが迫っていないときは、エラーをより注意深く分析しようと思います!

4

2 に答える 2

1

thisStep + 1すべての第 1 レベルのベクトルに要素があり、すべての第 2 レベルのベクトルに要素があると確信していますNUM_DEMESか?

私が正しく読んだ場合、実際にはマップイテレータに割り当てていないので、エラーはベクトルアクセスにあると思われます。

問題がどこにあるかを絞り込むために、最後のステートメントを複数のステートメントに分割して、それぞれに対して 1 つのことだけを実行すると役立つ場合があります。例えば、

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 );
于 2009-11-19T00:28:18.887 に答える
-1
( piItr -> second )[ thisStep ].at( d )

at() は、値へのアクセスではなく、内側のベクトルに反復子を返します。あなたが欲しいのは

 *(( piItr -> second )[ thisStep ].at( d ))
于 2009-11-19T01:11:48.060 に答える