我想制作一个类似于结构的地图,以允许通过两个键搜索两个都是字符串,这是一个例子:
Myclass s;
人p = s.find(“大卫”); //按名称搜索
// OR
p = s.find(“XXXXX”); //按ID搜索
我不想要一个代码解决方案,我只是想要一些帮助来开始像我可以用来实现我想要的结构,帮助是赞赏的人,这是决赛周。
答案 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))
O(2*log(2*n))
id
和name
应该是Person
的属性,这样当你找到给定其中一个键的具体元素时,你会立即拥有另一个键< / LI>
name
s中的任何一个都不应该同时是其他人的id
,反之亦然(没有id
应该是其他人的name
)