STL映射类似于数据结构,允许基于两个键进行搜索

时间:2014-02-01 00:39:17

标签: c++ list vector map stl

我想制作一个类似于结构的地图,以允许通过两个键搜索两个都是字符串,这是一个例子:

  

Myclass s;

     

人p = s.find(“大卫”); //按名称搜索

// OR
  

p = s.find(“XXXXX”); //按ID搜索

我不想要一个代码解决方案,我只是想要一些帮助来开始像我可以用来实现我想要的结构,帮助是赞赏的人,这是决赛周。

2 个答案:

答案 0 :(得分:2)

将您的记录放入矢量(或列表)中。将记录对象的指针添加到两个映射中,一个映射一个键,另一个映射另一个映射。

答案 1 :(得分:0)

有很多不同的方法可以实现这一目标。问题是:您的目标是插入,删除和查找操作的复杂性是什么?

std::map实现为红黑树,提供可递增的快速自平衡(旋转)和所有提到的操作(查找/查找,插入,删除),复杂度为O(log(n))。请注意,这适合单键的想法。

使用2个键时,您无法对元素进行排序,因为基于一个键的顺序很可能与基于另一个键的顺序不同。最直接和最自然的方法是将记录存储在一个容器中,并将此容器使用的密钥保存在2个不同的结构中,一个优化用于检索给定id的此密钥,另一个用于在给定name的情况下检索它。 }。

如果存在限制将所有内容存储在一个位置,而您希望优化支持两个不同键的查找操作,则可以创建std::map<std::string, Person>的包装器,其中每个元素将包含两次(每次在不同的键下),即:

std::map<std::string, Person> myContainer;
...
Person p;
std::string id = "1E57A";
std::string name = "David";
myContainer[id] = p;
myContainer[name] = p;
我可以想到这样做的两个好处:
  • 非常令人满意的表现:
    • 使用复杂性O(log(2*n))
    • 进行查找
    • 插入&amp;复制O(2*log(2*n))
    • 删除
  • 非常简单的实现(使用现有容器)
    • 你只需要记住容器的“预期”大小是其实际大小的一半
    • 这两个键:idname应该是Person的属性,这样当你找到给定其中一个键的具体元素时,你会立即拥有另一个键< / LI>
缺点是它将占用2倍的内存,甚至可能存在以下约束:
  • name s中的任何一个都不应该同时是其他人的id,反之亦然(没有id应该是其他人的name