我有 4 个单独的整数需要映射到任意的常量值。
例如,4,2,1,1 将映射到数字 42
数字 4,2,1,2 将映射到数字 86。
无论如何我可以通过使用#define 或某种std::map 来实现这一点。这个概念看起来很简单,但由于某种原因,我想不出一个好的、有效的方法来做到这一点。我尝试过的方法不起作用,所以我正在寻找一些关于实施的指导。
我有 4 个单独的整数需要映射到任意的常量值。
例如,4,2,1,1 将映射到数字 42
数字 4,2,1,2 将映射到数字 86。
无论如何我可以通过使用#define 或某种std::map 来实现这一点。这个概念看起来很简单,但由于某种原因,我想不出一个好的、有效的方法来做到这一点。我尝试过的方法不起作用,所以我正在寻找一些关于实施的指导。
利用 a std::map<std::vector<int>, int>
,使vector
包含{4,2,1,1}
的值为 42,依此类推。
编辑:我同意std::tuple
如果你有一个支持 C++11 的编译器,那将是一个更好的方法。我使用 a 是std::vector
因为它在这个阶段可以说更便携。您也可以使用std::array<int, 4>
.
如果您无权访问boost::tuple
,std::tuple
或std::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进行小于比较。
一个简单的功能就足够了吗?
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
基于解决方案的解决方案。
如果您知道总是有 4 个整数映射到 1 个整数,我建议您使用:
std::map< boost::tuple<int, int, int, int>, int >
已经为元组定义了比较(字典式)。