How to index and query STL map containers by multiple keys?

前端 未结 5 724
悲哀的现实
悲哀的现实 2020-12-16 14:20

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

5条回答
  •  盖世英雄少女心
    2020-12-16 15:09

    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
    

提交回复
热议问题