[Отказ от ответственности: я дал аналогичный ответ на этот вопрос уже]
Если вы можете использовать Boost, очень простым решением будет использование библиотеки только для заголовков Boost.Bimap (двунаправленные карты).
Рассмотрим следующую примерную программу, которая отображает несколько фиктивных записей в порядке вставки ( попробуйте здесь ):
#include <iostream>
#include <string>
#include <type_traits>
#include <boost/bimap.hpp>
using namespace std::string_literals;
template <typename T>
void insertByOrder(boost::bimap<T, size_t>& mymap, const T& element) {
using pos = typename std::remove_reference<decltype(mymap)>::type::value_type;
// We use size() as index, therefore indexing the elements with 0, 1, ...
mymap.insert(pos(element, mymap.size()));
}
int main() {
boost::bimap<std::string, size_t> mymap;
insertByOrder(mymap, "stack"s);
insertByOrder(mymap, "overflow"s);
// Iterate over right map view (integers) in sorted order
for (const auto& rit : mymap.right) {
std::cout << rit.first << " -> " << rit.second << std::endl;
}
}
Псевдоним напуганного типа в insertByOrder()
необходим для вставки элементов в boost::bimap
в следующей строке (см. Ссылочную документацию).