A bidirectional dictionary: usually you go key to value, sometimes value back to key. Both directions fit one operator[] — the argument type picks the direction. Re-keying through the string side is the tricky part: d["aa"] = 10 must find the entry holding "aa" and replace its key.
Implement Int2StrDict: d[1] = "aa" stores a pair; d["aa"] looks the key up by VALUE; assigning to d["aa"] = 10 re-keys that entry. Plus removal by key (d -= 2) and by value (d - "cc"). The subscript operator works in both directions.
Two overloads of operator[] by argument type give the two directions. The string side cannot return int& — return a small proxy.
The proxy needs operator int() for reads and operator=(int) for the re-key: erase the old entry, insert under the new key.
Hit Submit (or ⌘/Ctrl + ↵) — test results will show up here.