std::list<ValType> для быстрого доступа по индексу, std::hash<KeyType, size_t> для быстрого поиска по ключу, значения в хэше - индексы списка. Далее просто объединяем эти два объекта в одном классе. Пойдёт?
В принципе подойдёт, пока нет вставки удаления - т.е. перерасчет всего листа при произвольном удалении (вставке).
Нужен std::lower_bound выбирайте любой контейнер который это имеет, а можно и просто сортированный массив/вектор. Если данные нужно удалять/добавлять(и это критично по скорости) - тогда хужее. В бусте есть такой "multi" (не помню точно) и, пожертвовав еще кусочком коры мозга, постичь можно. Но я бы все-таки сделал свой
Про мульти знаю, но не хочу влазить ни в буст, ни в стд.
Вообщем пока решил так - массив (вектор) сортированый, поиск элемента - методом деления пополам. Хотя действительно, вместо сортированного массива можно использовать и метод, приведенный выше (если добавление элементов всегда в конец)