三张地图包括2把钥匙

1ac*_*ace 6 c++ map

我有一个包含3个字段的结构,两个ints (我们称之为AB)和一个bool (C).

我想创建一个该结构的数组,并能够通过任何键(A或B)访问它,获得孔对象(使用A,B和C)作为回报.我不需要做一些像"获取bool为真的所有对象"这样的东西,如果这有什么不同的话.

显然,两个关键都是独一无二的,bool不可能,但我想我为了清楚起见而提到它.

如果没有A或B,那就简单了std::map<int, bool>.

我目前看到的唯一解决方案是制作一个包含2 set秒和1 秒的包装器vector.有什么方法可以让我的生活更轻松吗?

注意:它最多包含一百个元组,因此性能不应成为问题.线性访问是可以接受的

为了使它更清晰,我希望能够做到这一点:

foobar<int, int, bool> array;  // or something along those lines

array.add(1, 101, true);
array.add(2, 102, false);

array.getA(1); // returns first object
array.getA(2);   // returns second object
array.getB(102); // returns second object again
Run Code Online (Sandbox Code Playgroud)

Bor*_*der 6

我相信你要找的是boost :: multi_index.它允许您声明具有多个索引的容器.

struct MultiIDStruct
{
    size_t idA;
    size_t idB;
    std::string name;
};

namespace mul = boost::multi_index;

boost::multi_index_container< MultiIDStruct, 
    mul::indexed_by< 
        mul::ordered_unique< mul::member< MultiIDStruct, size_t, &MultiIDStruct::idA > >,
        mul::ordered_unique< mul::member< MultiIDStruct, size_t, &MultiIDStruct::idB > > 
    > > data;
Run Code Online (Sandbox Code Playgroud)

(根据Rapptz建议使用名称空间"快捷方式")

例如,这里有一个multi_index容器,MultiIDStruct其中有两个唯一的排序,一个on idA(是其成员MultiIDStruct)和第二个on idB(也是一个成员).

模板参数起初看起来很少,但一旦你理解了它们的工作方式就不会那么糟糕.

  • 你可以通过`namespace mul = boost :: multi_index`或其他东西来缩短它. (2认同)