2012-01-17 10 views
-2

私はベクトルのマップを作成し、次のようにそれを設定しました。ここにコードがあります。私は元のコードを投稿することができません。それは倍精度のベクトルを含むベクトルの地図にアクセスするには?

map <int, vector <double> > Maptest; 

for (int i = 0 ; i < ID1; i++) 
{ 
    for (int j = 0 ; j < ID2; j++) 
    { 
     Maptest[i].push_back(j*0.01); 
    } 
} 

map <int, vector <double> >::iterator MaptestITR; 
CString testString; 
for (j = 0 ; j < ID2; j++) 
{ 
    for (i = 0 ; i < ID1; i++) 
    { 
     MaptestITR = Maptest.find(i); 
     if (MaptestITR != Maptest.end()) 
     { 
      testString.Format(_T("%f",MaptestITR->second.at(j))); 
     } 
     myfile << testString<< ',' ; 
    } 
} 

しかし、すべての値は '0'(testStringは '0')として更新されます。 IDEでは、値がウォッチに正しく表示されます。

ここには何がありますか?

+3

フォーマットを修正したい場合があります。 –

+1

おそらく、問題を示すコンパクトな小さな例を投稿することができます。 –

+3

コードは不完全でコンパイルできないので、問題を理解することは非常に難しいです。私たちがあなたを助けるために使用できるいくつかのコンテキストを持っているように、より多くのコードを投稿してください。 – blahman

答えて

1

std::vector::at()は、整数パラメータが必要です。具体的には、size_t

私はどのタイプがID2であるのか分かりませんが、あなたが与えたコードからはsize_tではありません。

+0

私はインデックスとして整数にベクトルをアクセスしています。編集した質問にお答えください。 – Onnesh

+0

は、http://stackoverflow.com/questions/5293466/c-push-back-inside-a-map-of-vectorsと同じです。 – Onnesh

1

さて、私は仕事場で仮想マシンを起動し、あなたのコードの近似を実行しました。コードには、私が実際に理解していないことがいくつかあります。

まず、vector以外のものにアクセスしている "at"への呼び出しはありませんか?ゼロ参照されていませんか?この場合、毎回vectorの外部にあるものにアクセスしている可能性があります。その結果、動作は定義されていませんか?たぶん、第二に

testString.Format(_T("%f",MaptestITR->second.at(ID2))); 

0代わりのID2を使用してみてください、私はこの近似を走った、と私は期待どおりの結果を得ました。つまり、私が前に述べた未定義の動作とは別に、あなたのコードがなぜ機能しないのか分かりません。

最後に、あなたのコードが何をしようとしているか説明してください。同じ番号の多くをプッシュバックした後、マップ内の唯一のベクトルの同じ位置にアクセスするように見えます。

誰でもVMからコピーする方法のヒントを教えていただけたら、Linuxでコンパイルしていたコードの近似を投稿することもできます。

...そして今、仕事に戻って...

0

私は主な問題は、あなたのプログラムは、あなたがそれだと思うことmapを作成していないこと、そしてあなたのプログラムが表示されていないということだと思いますあなたが思うベクトル項目。この回答の目的のために

、私は、識別子ID1ID2が単純な整数定数で単純な整数の変数またはマクロであることを仮定している(と0より大きい値を持っている、またはプログラムは、基本的に何もしません)。 ID1またはID2がさらに複雑な場合、これらの識別子の詳細についての情報がなくても、プログラムが何をしているのか、そうしているのかを判断することは困難です。

それぞれのネストされたループで何が起こっているかを見てみましょう。最初に

ID1が変更されていないので、使用されて

Maptest[ID1].push_back(ID2*0.01); 
map

キーは常に同じです。したがってMaptestには、キー値がID1の1つの項目と、各ループの繰り返しで要素が追加されるベクターが1つだけ含まれています。また、ベクトルに追加される各要素の値は同じで、(ID2 * 0.01)です。

特に、ネストされたループが変数ijによって制御されていても、これらの変数はpush_back()呼び出しで使用されないことに注意してください。したがって、最初のネストされたループが完了した後、Maptestには、キーがID1であり、ベクトルに(ID1 * ID2)の要素が含まれている単一のマッピングが含まれています。そのベクトルの各要素の値は(ID2 * 0.01)です。 (mapで唯一の項目であることを起こる)キーID1と1 - 2番目のネストされたループでは

は、あなたは常に Maptestで同じアイテムを見つけています。このマッピングの部分には (ID1 * ID2)要素の配列があり、それぞれの値は同じです。ループによって、インデックス ID2の要素が testStringにフォーマットされます。常に同じベクトルからの同じ要素。各要素が同じ値を持つので、どの要素が文字列にフォーマットされているかは重要ではありません。

関連する問題