Prevenga el acceso directo a std :: teclas de mapa

Me gustaría envolver unstd::map por lo que el cliente no sabe que estoy almacenando sus claves enteras positivas en realidad como enteros negativos. Necesito permitir iterar sobre la clase y acceder a los elementos.

Pensé en esta clase:

template<class K, class V>
class Container
{
public:

    Container(){}

    void insert(const K& key, const V& value)
    {
        _map[key] = value;
    }

    bool getFirstElement(K& key, V& value)
    {
        if (false == _map.empty())
        {
            _iter = _map.begin();
            value = _iter->second;
            key = std::abs(_iter->first);
            return true;
        }
        return false;
    }

    bool getNextElement(K& key, V& value)
    {
        ++_iter;
        if (_iter != _map.end())
        {
            key = std::abs(_iter->first);  // I modify the key
            value = _iter->second;
            return true;
        }

        return false;
    }

private:
    typename std::map<K, V>::iterator _iter; // Caches client's position whilst iterating
    std::map<K, V> _map;
};

El uso sería:

int main()
{
    Container<int, int> o;

    o.insert(-1, 100);
    o.insert(-2, 200);
    o.insert(-3, 300);

    int key;
    int value;
    o.getFirstElement(key, value);

    std::cout << "key: " << key << " val: " << value << std::endl;

    while (o.getNextElement(key, value))
    {
        std::cout << "key: " << key << " val: " << value << std::endl;
    }
}

Sin embargo, no me gusta tener dos métodos para iterar, primerogetFirstElement() fuera del bucle ylueg getNextElement() dentro del bucle.

¿Hay alguna manera de lograr esto para que el cliente pueda escribir código más ordenado?

Respuestas a la pregunta(2)

Su respuesta a la pregunta