C ++ STD :: MAP复杂密钥搜索

时间:2011-03-31 15:19:18

标签: c++ stdmap

我对图书馆的访问权限有限,所以虽然使用boost :: multi_index可以解决我的问题,但这是我无法使用的。

我当前的地图设置是: 该结构中包含大量信息,例如我还需要搜索的INT。我希望的是一个结构,以便我可以通过int或string搜索并返回结构值。我假设我将不得不写密钥但是,来这里寻求其他建议。

想法?

2 个答案:

答案 0 :(得分:2)

我有点困惑。你似乎在说你有这样的结构:

(psudocode)

struct Gizmo
{
  Gizmo(int foo, string bar) : foo_(foo), bar_(bar) {};
  int foo_;
  string bar_;
};
Gizmo make_gizmo(int foo, string bar) { return Gizmo(foo,bar); }
std::map<string, Gizmo> my_gizmos;

my_gizmos["aaa"] = make_gizmo(1,"hello");
my_gizmos["bbb"] = make_gizmo(2,"there");

...您希望能够按Gizmo的值搜索foo_

在这种情况下,您有2个主要选项。

1)自己写一个自定义仿函数(再次psudocude):

struct match_foo : public std::unary_function<...>
{
  match_foo(int foo) : foo_(foo) {};
  bool operator()(map<string,Gizmo>::const_iterator it) const
  {
    return it->second.foo_ == foo_;
  } 
private:
  int foo_;
};

map<string,Gizmo>::const_iterator that = find_if(my_gizmos.begin(), my_gizmos.end(), match_foo(2));
};

2)创建foo_值的索引,映射回主Gizmo中的map。这张地图可能看起来像这样 ... 一个

   map<int,map<string,Gizmo>::const_iterator> foo_index;

...每次更新主地图时都会保留my_gizmos

答案 1 :(得分:0)

如果您的搜索实际上是窗口查询(意味着您必须在[param0_0,peram0_1] x [param1_0,param1_2] x ...)中返回值,那么您可以使用范围树结构来提高效率。