C++ C++;映射复杂键搜索

C++ C++;映射复杂键搜索,c++,stdmap,C++,Stdmap,我对库的访问有限,所以尽管使用boost::multi_index可以解决我的问题,但这是我无法使用的 我当前的地图设置是: 这个结构包含了大量的信息,比如我需要搜索的INT。我所希望的是一个结构,例如,这样我就可以通过int或string搜索并返回结构值。我假设我要写钥匙,但我来这里是想得到其他建议 想法?我有点困惑。你似乎在说你有这样一个结构: (psudocode) 2) 创建foo\uu值的索引,映射回主map中的Gizmo。这张地图可能看起来像这样 ... a map foo_索引;

我对库的访问有限,所以尽管使用boost::multi_index可以解决我的问题,但这是我无法使用的

我当前的地图设置是: 这个结构包含了大量的信息,比如我需要搜索的INT。我所希望的是一个结构,例如,这样我就可以通过int或string搜索并返回结构值。我假设我要写钥匙,但我来这里是想得到其他建议


想法?

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

(psudocode)

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

map foo_索引;

…如果您的搜索实际上是窗口查询(意味着您必须返回[param0\u 0,peram0\u 1]x[param1\u 0,param1\u 2]x…中的值),则在更新主地图时,
my_gizmo

都会维护此功能,然后,您可以使用范围树结构来提高效率。

您基本上已经给出了答案:自己编写。boost又出了什么问题?您可以使用std::pair并添加自己的谓词进行搜索。可以保留指向相同对象的两个不同贴图。也许您可以将字符串和int散列成一个键?@AJG85:Boost在许多环境中都不是一个选项,原因有很多。@AJG85-Boost没有错。但并不是每个人都能使用它。使用迭代器真的明智吗?当您更新地图时,它们可能会失效。+1:对于选项1,即@Manic他关于在任何时候更新映射时都需要维护的警告与此相关。@AJG85:啊,好的,我认为他的意思只是将其添加到映射中并从两个映射中删除。@Manickin:现有迭代器在映射中不会失效,除非您删除它们。我想您可能会在每次使用某种锁定进行搜索时,在堆栈上创建一个
typedef
,然后从当前
my\u gizmo
映射创建一个
foo\u索引,以防止gizmo映射在搜索范围内发生更改。。。它可能会变得更粗略,这就是为什么我更喜欢选项1;)
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");
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));
};
   map<int,map<string,Gizmo>::const_iterator> foo_index;