私は以下のコードを用意しています。"Vector Subscript Out of Range" std :: vectorをstd :: mapの値として使用する
std::vector<GLuint> testVector = { 6, 7, 8 };
std::map<std::pair<GLfloat, GLfloat>, std::vector<GLuint>> testMap;
testMap.insert(std::make_pair(std::make_pair(1.0f,1.0f), testVector));
std::vector <GLuint> retrievalVector =
testMap.find(std::make_pair(1.0f, 1.0f))->second;
std::cout << "Retrieval Vector: " << retrievalVector[0] << "\t"
<< retrievalVector[1] << "\t"
<< retrievalVector[2] << std::endl;
retrievalVector.push_back(9);
std::cout << "Retrieval Vector: " << retrievalVector[0] << "\t"
<< retrievalVector[1] << "\t"
<< retrievalVector[2] << "\t"
<< retrievalVector[3] << std::endl;
testMap.insert(std::make_pair(std::make_pair(1.0f, 1.0f), retrievalVector));
retrievalVector = testMap.find(std::make_pair(1.0f, 1.0f))->second;
std::cout << "Retrieval Vector: " << retrievalVector[0] << "\t"
<< retrievalVector[1] << "\t"
<< retrievalVector[2] << "\t"
<< retrievalVector[3] << std::endl;
基本的に、座標をキーにしてマップに整数のベクトルを挿入します。私は同じベクトルを取得し、内容がうまく格納されていることを確認します。私はベクトルに別の整数を加え、同じ場所にそれを挿入し直します。もう一度それを取得し、ベクトルの内容(最後のcout)を印刷しようとすると、範囲外のアクセスが発生します。
これがなぜ起こるのか、知識の豊富な人が説明できますか?
浮動小数点数型は非常に気まぐれですが、正確に一致する必要のあるキーには使用しないことをお勧めします。これは 'GLfloat'の代わりに' int'で動作しますか?また、 'retrievalVector'を操作しようと思っているのであれば、コピーではなく参照として宣言したいかもしれません。 – tadman
マップのキーとして浮動小数点数を使用すると、数値解析に非常に注意が払われない限り、将来すべての種類の悲しみが発生します。代わりにスケーリングされた整数を使用できませんか? –