Обычно я, если обе сущности могут выступать как в качестве ключа так и в качестве значения, использую связку из двух std::map;
Но это скучно. Возможно нынче есть какой-то стандартный контейнер (не из Boost), который может искать и так и шиворот-навыворот? Что-то даже не знаю как толково такое загуглить.