2011-03-01 96 views
0

我想创建一个类,像下面C++ - 如何创建一个多重映射有4个变量和4个键

class enumClass 
{ 
    int msdnEnum; 
    std::string msdnEnumString; 
    int localEnum; 
    std::string localEnumString; 
} 

std::set<enumClass_Objects> enums; // all msdnEnums are unique, same aplies to other three. 

enums.find(given_msdnEnum)->FourthVariable; 
enums.find(given_localEnum)->FirstVariable; 
enums.find(given_msdnEnumStr)->anyVariable; 
enums.find(given_localEnumStr)->anyVariable; 

我提到的boost ::多指标。但我不认为这对这种情况有帮助。任何人都可以说出实现这个目标的方式吗?

编辑 我在阅读模板类方面没那么好。至于我所关心的,我没有在multiIndex中找到任何“查找”方法。我只看到了那个例子中的东西(第一个基本的例子:link)。建议&建议总是欢迎

回答

3

下面是使用boost.multi_index一个简单的例子:

#include <string> 
#include <boost/multi_index_container.hpp> 
#include <boost/multi_index/ordered_index.hpp> 
#include <boost/multi_index/member.hpp> 

struct enumClass 
{ 
    int msdnEnum; 
    std::string msdnEnumString; 
    int localEnum; 
    std::string localEnumString; 
}; 

namespace bmi = boost::multi_index; 

typedef bmi::multi_index_container< 
    enumClass, 
    bmi::indexed_by< 
    bmi::ordered_unique<bmi::member<enumClass, int, &enumClass::msdnEnum> >, 
    bmi::ordered_unique<bmi::member<enumClass, std::string, &enumClass::msdnEnumString> >, 
    bmi::ordered_unique<bmi::member<enumClass, int, &enumClass::localEnum> >, 
    bmi::ordered_unique<bmi::member<enumClass, std::string, &enumClass::localEnumString> > 
    > 
> enumClassSet; 

int main() 
{ 
    enumClassSet enums; 
    enums.get<0>().find(/*given_msdnEnum*/);  // index 0 is enumClass::msdnEnum 
    enums.get<1>().find(/*given_msdnEnumStr*/); // index 1 is enumClass::msdnEnumString 
    enums.get<2>().find(/*given_localEnum*/); // index 2 is enumClass::localEnum 
    enums.get<3>().find(/*given_localEnumStr*/); // index 3 is enumClass::localEnumString 
} 

标签类可以使用名称访问索引,而不是序号索引为好,这使用的是这样的:

struct byMsdnEnum; 
struct byMsdnEnumStr; 
struct byLocalEnum; 
struct byLocalEnumStr; 

typedef bmi::multi_index_container< 
    enumClass, 
    bmi::indexed_by< 
    bmi::ordered_unique<bmi::tag<byMsdnEnum>, bmi::member<enumClass, int, &enumClass::msdnEnum> >, 
    bmi::ordered_unique<bmi::tag<byMsdnEnumStr>, bmi::member<enumClass, std::string, &enumClass::msdnEnumString> >, 
    bmi::ordered_unique<bmi::tag<byLocalEnum>, bmi::member<enumClass, int, &enumClass::localEnum> >, 
    bmi::ordered_unique<bmi::tag<byLocalEnumStr>, bmi::member<enumClass, std::string, &enumClass::localEnumString> > 
    > 
> enumClassSet; 

int main() 
{ 
    enumClassSet enums; 
    enums.get<byMsdnEnum>().find(/*given_msdnEnum*/); 
    enums.get<byMsdnEnumStr>().find(/*given_msdnEnumStr*/); 
    enums.get<byLocalEnum>().find(/*given_localEnum*/); 
    enums.get<byLocalEnumStr>().find(/*given_localEnumString*/); 
} 

这两种方法之间的区别是纯粹的审美,当然标签类可以被命名为任何你想要的,而不是byMsdnEnum等。还要注意,散列索引可以使用,而不是有序索引,这将使你的指数ŧ他的行为std::unordered_map而不是std::map

+0

+1张贴代码... :) – Nim 2011-03-01 09:52:59

+0

@ildjarn我试图把typedef boost :: multi_index boost_Multi;但它没有奏效。我能知道为什么吗? – prabhakaran 2011-03-01 10:10:14

+0

'boost :: multi_index'是一个命名空间,不是一个类型,因此不能被typedef。如果你想创建一个名称空间别名,就像我在代码示例中用'bmi'完成'namespace boost_Multi = boost :: multi_index;'。 – ildjarn 2011-03-01 10:13:43

0

是否有一个理由,为什么你不能使用2张地图? (std :: map < int,std :: string>)。如果你需要找到两个任意这两个键的字符串变量的,那么你可以通过具有映射,将配对例如msdnEnum有两个字符串,然后有一个地图,将配对localEnummsdnEnum解决它。通过msdnEnum进行的任何查找都将直接完成,通过localEnum的查找将首先执行到msdnEnum的翻译,然后执行直接查找。

+0

这会在执行中产生问题。还请参阅编辑。 – prabhakaran 2011-03-01 08:30:06

+0

我想将它作为单行代码。从编辑中你可以看到我的需求比std :: map – prabhakaran 2011-03-01 09:28:51

4

升压多指标正是你在这种情况下所需要的。为这四个键构建四个索引 - 我想给你保证它们都是唯一的,使它们成为唯一索引(我相信其中只有一个可以是hashed_unique,但我认为你可以使另外三个ordered_unique),然后执行您对每个索引的搜索取决于您正在搜索的内容。

+2

prabhakaran更多:“我提到了boost :: multiIndex,但我认为它对这种情况没有帮助。” - 为什么你不列出你遇到的具体问题。同样,PeterK的答案是“这会造成问题”并不是很有用。请记住,你不知道该怎么做,所以你会发现问题的地方有望成为解决方案。如果你随意忽略答案而没有解释,你不能指望任何人的回答 - 对或错 - 领导任何地方。 – 2011-03-01 09:04:42

+0

用于校正@Tony感谢看到编辑 – prabhakaran 2011-03-01 09:24:03

+0

@prabhakaran,容器本身并不具有任何AFAIK查找方法,但正常的操作模式是,你得到的容器的特定指数,并且有一个find方法在索引来搜索您的关键 - 在这里看看这个例子:http://www.boost.org/doc/libs/1_46_0/libs/multi_index/doc/tutorial/basics.html#list_ops – Nim 2011-03-01 09:40:04