#include <iostream>
#include <vector>
#include <map>
#include <string>
template<typename Key, typename Val>
class OrderedMap
{
private:
std::vector<std::pair<Key, Val>> ordered;
std::map<Key, std::size_t> lookup;
public:
void insert(Key k, Val v)
{
ordered.push_back(std::pair<Key, Val>(k, v));
lookup.emplace(k, ordered.size() - 1);
}
Val find(Key k)
{
std::size_t index = lookup[k];
return ordered[index].second;
}
// "typename" needed as the "iterator" is a dependent type
typename std::vector<std::pair<Key, Val>>::iterator begin()
{
return ordered.begin();
}
typename std::vector<std::pair<Key, Val>>::iterator end()
{
return ordered.end();
}
};
int main()
{
OrderedMap<std::string, int> m;
m.insert("1", 1);
m.insert("2", 2);
m.insert("3", 3);
std::cout << m.find("2") << std::endl << std::endl;
for (auto i = m.begin(); i != m.end(); i++)
std::cout << i->first << " " << i->second << std::endl;
std::cout << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c3RyaW5nPgoKdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBWYWw+CmNsYXNzIE9yZGVyZWRNYXAKewpwcml2YXRlOgoJc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEtleSwgVmFsPj4gb3JkZXJlZDsKCXN0ZDo6bWFwPEtleSwgc3RkOjpzaXplX3Q+IGxvb2t1cDsKCQpwdWJsaWM6Cgl2b2lkIGluc2VydChLZXkgaywgVmFsIHYpCgl7CgkJb3JkZXJlZC5wdXNoX2JhY2soc3RkOjpwYWlyPEtleSwgVmFsPihrLCB2KSk7CgkJbG9va3VwLmVtcGxhY2Uoaywgb3JkZXJlZC5zaXplKCkgLSAxKTsKCX0KCQoJVmFsIGZpbmQoS2V5IGspCgl7CgkJc3RkOjpzaXplX3QgaW5kZXggPSBsb29rdXBba107CgkJcmV0dXJuIG9yZGVyZWRbaW5kZXhdLnNlY29uZDsKCX0KCQoJLy8gInR5cGVuYW1lIiBuZWVkZWQgYXMgdGhlICJpdGVyYXRvciIgaXMgYSBkZXBlbmRlbnQgdHlwZQoJdHlwZW5hbWUgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEtleSwgVmFsPj46Oml0ZXJhdG9yIGJlZ2luKCkKCXsKCQlyZXR1cm4gb3JkZXJlZC5iZWdpbigpOwoJfQoJdHlwZW5hbWUgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEtleSwgVmFsPj46Oml0ZXJhdG9yIGVuZCgpCgl7CgkJcmV0dXJuIG9yZGVyZWQuZW5kKCk7Cgl9Cn07CgppbnQgbWFpbigpCnsKCU9yZGVyZWRNYXA8c3RkOjpzdHJpbmcsIGludD4gbTsKCW0uaW5zZXJ0KCIxIiwgMSk7CgltLmluc2VydCgiMiIsIDIpOwoJbS5pbnNlcnQoIjMiLCAzKTsKCQoJc3RkOjpjb3V0IDw8IG0uZmluZCgiMiIpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CgkKCWZvciAoYXV0byBpID0gbS5iZWdpbigpOyBpICE9IG0uZW5kKCk7IGkrKykKCQlzdGQ6OmNvdXQgPDwgaS0+Zmlyc3QgPDwgIiAiIDw8IGktPnNlY29uZCA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoJCglyZXR1cm4gMDsKfQ==