我有4个单独的整数需要映射到任意的常量值。
例如,4,2,1,1将映射到数字42
数字4,2,1,2将映射到数字86。
无论如何,我可以通过使用#define或某种std :: map来实现这一点。这个概念看起来很简单,但出于某种原因,我无法想到一个好的,有效的方法。我尝试过的方法不起作用,所以我正在寻找一些实施的方法。
答案 0 :(得分:2)
利用std::map<std::vector<int>, int>
,以便包含vector
的{{1}}的值为42,依此类推。
编辑:如果你有一个支持C ++ 11的编译器,我同意{4,2,1,1}
是一个更好的方法。我使用了std::tuple
,因为在这个阶段可以说它更具便携性。您还可以使用std::vector
。
答案 1 :(得分:1)
如果您无权访问boost::tuple
,std::tuple
或std::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 >
已经为元组定义了比较(词典编纂)。