- #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==