0

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

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

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

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

4

4 回答 4

2

利用 a std::map<std::vector<int>, int>,使vector包含{4,2,1,1}的值为 42,依此类推。

编辑:我同意std::tuple如果你有一个支持 C++11 的编译器,那将是一个更好的方法。我使用 a 是std::vector因为它在这个阶段可以说更便携。您也可以使用std::array<int, 4>.

于 2012-08-29T05:13:27.250 回答
1

如果您无权访问boost::tuple,std::tuplestd::array,您可以实现一个包含 4 个整数的类型,并使用合适的小于比较满足严格的弱排序

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进行小于比较。

于 2012-08-29T05:41:12.763 回答
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基于解决方案的解决方案。

于 2012-08-29T06:10:28.057 回答
0

如果您知道总是有 4 个整数映射到 1 个整数,我建议您使用:

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

已经为元组定义了比较(字典式)。

于 2012-08-29T05:24:48.003 回答