他の人が答えで言ったように、 std::vector の形式ですべてのキーまたは値にアクセスすることはできません。それらをコピーせずに- std::map はこの形式のアクセス用に設計されていません。
あなたの状況では、2 つのコンテナーをセットアップします。
std::vector<GLuint> texture_id;
std::map<std::string, size_t> texture_map;
ここで、ベクトルは ID を格納し、マップの値はベクトル内の ID へのインデックスです。新しいテクスチャを追加するときは、ID を でベクターに追加しますpush_back()
。そのインデックスは、最後の要素のインデックスと共にマップ エントリに保存されます。例:
pair<map<string, size_t>::iterator, bool> result =
texture_map.insert(make_pair(new_texture_name, -1)); //ignore the index for now
if(result.second) { //true when the texture name isn't already in the map
texture_id.push_back(new_id);
result.first->second = texture_id.size()-1; //update the index in the map to this ID's element in texture_id
}
push_back は、古い ID に対して同じインデックスを維持します。他の質問への回答と同様に、テクスチャを追加および検索する関数を使用して、これらすべてをクラス内にカプセル化します。
これにより、ID がロードされた後に呼び出すことができます。
glGenTextures( textures_id.size(), &(textures_id[0]) );
... std::vector は、要素がメモリ内で互いに連続していることを保証するためです。
編集: マップの値のタイプを変更しました。これは以前は GLuint* で、ベクトルの要素を指していました。この設計の欠陥を指摘してくれた Oli Charlesworth に感謝します。編集:サンプルコードを追加