    #include <iostream>
    #include <unordered_map>
    #include <algorithm>
    using namespace std;
    
    using Dict = unordered_map<size_t, size_t>;
    
    class CoDec
    {
    	Dict dict;
    public:
    	size_t code(const size_t in)
    	{
            //ищем в словаре
    		const auto pos = dict.find(in);
    		if(pos==dict.end())
    		{
                //если не нашли, пополняем словарь
                //присваиваем новый код, равный прошлой длине словаря;
    			const size_t cnt=dict.size();
    			return dict[in] = cnt;
    		}            
    		return pos->second; //если нашли, просто выдаем словарное значение
    	}
    	size_t decode(const size_t in) const
    	{
            //выдаем из словаря нужное значение по коду
    		return find_if(dict.cbegin(), dict.cend(), [&in](const Dict::value_type& a)
    		{
    			return in == a.second;
    		})->first;
    	}
    };
    
    int main() 
    {
    	CoDec cdc;
    	cout << cdc.code(2)  <<' '<< cdc.code(5)   <<' '<< cdc.code(8)  <<' '<< cdc.code(5)  << endl ;
    	cout << cdc.decode(0)<<' '<< cdc.decode(1) <<' '<< cdc.decode(2)<<' '<< cdc.decode(1)<< endl;
    	return 0;
    }