Как уже говорили другие в своих ответах, вы не можете получить доступ ко всем ключам или значениям в форме std :: vector без их копирования - std :: map не предназначен для этой формы доступа.
Для вашей ситуации я бы настроил 2 контейнера:
std::vector<GLuint> texture_id;
std::map<std::string, size_t> texture_map;
где вектор хранит идентификатор, а значение карты является индексом идентификатора в векторе. Когда вы добавляете новую текстуру, добавьте идентификатор в вектор с 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 будет поддерживать те же индексы для старых идентификаторов. Инкапсулируйте все это в классе с помощью функций для добавления и поиска текстур, как в ответе на другой вопрос.
Это позволит вам позвонить после загрузки идентификаторов:
glGenTextures( textures_id.size(), &(textures_id[0]) );
... поскольку std :: vector гарантирует, что элементы являются последовательными по отношению друг к другу в памяти.
edit: изменил тип значения карты; это было ранее GLuint *, указывая на элементы вектора. Спасибо Оли Чарльзуорту за то, что он указал на недостаток этого дизайна.
редактировать: добавлен пример кода