I came across one requirement where the record is stored as
Name : Employee_Id : Address
where Name and Employee_Id are supposed to be k
Example with tew keys:
#include #include #include template class MultiKeyMap { public: struct Entry { KEY1 key1; KEY2 key2; OTHER otherVal; Entry( const KEY1 &_key1, const KEY2 &_key2, const OTHER &_otherVal): key1(_key1),key2(_key2),otherVal(_otherVal) {}; Entry() {}; }; private: struct ExtendedEntry; typedef std::shared_ptr ExtendedEntrySptr; struct ExtendedEntry { Entry entry; typename std::map::iterator it1; typename std::map::iterator it2; ExtendedEntry() {}; ExtendedEntry(const Entry &e):entry(e) {}; }; std::map byKey1; std::map byKey2; public: void del(ExtendedEntrySptr p) { if (p) { byKey1.erase(p->it1); byKey2.erase(p->it2); } } void insert(const Entry &entry) { auto p=ExtendedEntrySptr(new ExtendedEntry(entry)); p->it1=byKey1.insert(std::make_pair(entry.key1,p)).first; p->it2=byKey2.insert(std::make_pair(entry.key2,p)).first; } std::pair getByKey1(const KEY1 &key1) { const auto &ret=byKey1[key1]; if (ret) return std::make_pair(ret->entry,true); return std::make_pair(Entry(),false); } std::pair getByKey2(const KEY2 &key2) { const auto &ret=byKey2[key2]; if (ret) return std::make_pair(ret->entry,true); return std::make_pair(Entry(),false); } void deleteByKey1(const KEY1 &key1) { del(byKey1[key1]); } void deleteByKey2(const KEY2 &key2) { del(byKey2[key2]); } }; int main(int argc, const char *argv[]) { typedef MultiKeyMap M; M map1; map1.insert(M::Entry(1,"aaa",7)); map1.insert(M::Entry(2,"bbb",8)); map1.insert(M::Entry(3,"ccc",9)); map1.insert(M::Entry(7,"eee",9)); map1.insert(M::Entry(4,"ffffd",9)); map1.deleteByKey1(7); auto a=map1.getByKey1(2); auto b=map1.getByKey2("ffffd"); auto c=map1.getByKey1(7); std::cout << "by key1=2 (should be bbb ): "<< (a.second ? a.first.key2:"Null") << std::endl; std::cout << "by key2=ffffd (should be ffffd ): "<< (b.second ? b.first.key2:"Null") << std::endl; std::cout << "by key1=7 (does not exist): "<< (c.second ? c.first.key2:"Null") << std::endl; return 0; }
Output:
by key1=2 (should be bbb ): bbb by key2=ffffd (should be ffffd ): ffffd by key1=7 (does not exist): Null