将4个整数的组合映射到单个值

时间:2012-08-29 05:08:55

标签: c++ hash containers

我有4个单独的整数需要映射到任意的常量值。

例如,4,2,1,1将映射到数字42

数字4,2,1,2将映射到数字86。

无论如何,我可以通过使用#define或某种std :: map来实现这一点。这个概念看起来很简单,但出于某种原因,我无法想到一个好的,有效的方法。我尝试过的方法不起作用,所以我正在寻找一些实施的方法。

4 个答案:

答案 0 :(得分:2)

利用std::map<std::vector<int>, int>,以便包含vector的{​​{1}}的值为42,依此类推。

编辑:如果你有一个支持C ++ 11的编译器,我同意{4,2,1,1}是一个更好的方法。我使用了std::tuple,因为在这个阶段可以说它更具便携性。您还可以使用std::vector

答案 1 :(得分:1)

如果您无权访问boost::tuplestd::tuplestd::array,则可以实现一种类型,其中包含4个整数,其中包含满足strict weak ordering的适当小于的比较:

struct FourInts {
  int a,b,c,d;
  FourInts() : a(), b(), c(), d() {}
  bool operator<(const FourInts& rhs) const {
    // implement less-than comparison here
  }
};

然后使用std::map

std::map<FourInts, int> m;

如果您在一个标准库容器数组中组织您的整数,则可以使用std::lexicographical_compare进行小于比较。

答案 2 :(得分:1)

简单的功能是否足够?

int get_magic_number( int a, int b , int c, int d)
{
   if( (a==4)&&(b==2)&&(c==1)&&(d==1) ) return 42;
   if( (a==4)&&(b==2)&&(c==1)&&(d==2) ) return 86;
   ...
   throw SomeKindOfError();
}

现在看起来可能看起来很难看,但你可以轻松创建一个宏来完善它。 (或者是帮助类或其他什么......我只是展示宏,因为我觉得很容易。

int get_magic_number( int a, int b , int c, int d)
{
   #DEFINE MAGIC(A,B,C,D,X) if((a==(A))&&(b==(B))&&(c==(C))&&(d==(D))) return (X);
   MAGIC(4,2,1,1,  42);
   MAGIC(4,2,1,2,  86);
   ...
   #UNDEF MAGIC
   throw SomeKindOfError();
}

如果您真的在乎,您也可以制作一个constexpr版本,这是基于std::map的解决方案永远无法做到的。

答案 3 :(得分:0)

如果你知道总有4个整数映射到1个整数,我建议你选择:

std::map< boost::tuple<int, int, int, int>, int >

已经为元组定义了比较(词典编纂)。