C++ 将4个整数的组合映射到单个值
我有4个独立的整数需要映射到任意的常量值 例如,4,2,1,1将映射到数字42 数字4,2,1,2将映射到数字86 我是否可以通过使用#define或某种std::map来实现这一点。这个概念似乎很简单,但出于某种原因,我想不出一个好的、有效的方法来实现它。我尝试过的方法不起作用,所以我正在寻找一些实现指南。利用C++ 将4个整数的组合映射到单个值,c++,hash,containers,C++,Hash,Containers,我有4个独立的整数需要映射到任意的常量值 例如,4,2,1,1将映射到数字42 数字4,2,1,2将映射到数字86 我是否可以通过使用#define或某种std::map来实现这一点。这个概念似乎很简单,但出于某种原因,我想不出一个好的、有效的方法来实现它。我尝试过的方法不起作用,所以我正在寻找一些实现指南。利用std::map,这样包含{4,2,1,1}的向量将具有值42,依此类推 编辑:我同意如果你有一个支持C++11的编译器,std::tuple将是一个更好的方法。我使用了一个std::v
std::map
,这样包含{4,2,1,1}
的向量将具有值42,依此类推
编辑:我同意如果你有一个支持C++11的编译器,std::tuple
将是一个更好的方法。我使用了一个std::vector
,因为在这个阶段它可以说更便于移植。您还可以使用std::array
使用std::map
,这样包含{4,2,1,1}
的向量将具有值42,依此类推
编辑:我同意如果你有一个支持C++11的编译器,std::tuple
将是一个更好的方法。我使用了一个std::vector
,因为在这个阶段它可以说更便于移植。如果您知道总是有4个整数映射到1个整数,那么您也可以使用std::array
,我建议您选择:
std::map< boost::tuple<int, int, int, int>, int >
std::map
已经为元组定义了比较(字典式)。如果您知道总是有4个整数映射到1个整数,我建议您选择:
std::map< boost::tuple<int, int, int, int>, int >
std::map
已经为元组定义了比较(字典式)。如果您没有访问boost::tuple
、std::tuple
或std::array
的权限,则可以实现一个包含4个整数的类型,并且该类型的比较满足以下条件:
struct FourInts{
INTA、b、c、d;
FourInts():a(),b(),c(),d(){}
bool运算符如果您没有访问boost::tuple
、std::tuple
或std::array
的权限,则可以实现一个包含4个整数的类型,并使用适当的小于以下值的比较:
struct FourInts{
INTA、b、c、d;
FourInts():a(),b(),c(),d(){}
布尔运算符一个简单的函数就足够了吗
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
的解决方案所无法做到的。一个简单的函数就足够了吗
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个整数代表什么,它们映射到的数字是如何选择的?映射将用于什么?4个整数在什么范围内lie?0..2^31-1?您希望有多少个映射?这4个整数的最大值是多少?查找对性能的敏感程度如何?是否在关键路径中?您能否提供更详细的信息?例如,这4个整数代表什么,它们映射到的数字是如何选择的?映射将用于什么n这4个整数的范围是多少?0..2^31-1?您希望有多少个映射?这4个整数的最大值是多少?查找对性能有多敏感?它是否在关键路径中?我猜您实际上没有尝试过这一点。(std::vector LessThan可比吗?)如果你知道总是有4个整数,我认为应该使用数组或元组而不是向量,所以定义一个比较(const std::vector&a,const std::vector&b)函数并用它初始化映射…@NemooperatorYeah我使用std::vector是因为它更便于携带,而且运行良好。谢谢!我猜你实际上还没有尝试过这一点。(std::vector是否可以比较?)如果你知道总是有4个整数,我认为应该使用数组或元组而不是向量,所以定义一个比较(const std::vector&a,const std::vector&b)函数并用它初始化映射…@NemooperatorYeah我使用std::vector是因为它更便于移植,而且工作得很好。谢谢!不幸的是,我不想仅仅为了boost:tup而链接到boost库,我只是在寻找一些简单的东西。我不想仅仅为了boost:tup而链接到boost库le,我在寻找一些简单的东西。这看起来确实是一个不错的选择。你认为所有的if语句在性能方面会比vector/map实现@Yuushi提到的更好/更差吗?这将取决于你的编译器选项/功能。(可能还有语句的顺序。)如果您想使用显式版本,您可以将If分支合并在一起,并使用else If
等来获得应该/可能比map版本快得多的东西。(map有很多指针遍历开销等)。我希望在某些情况下(如果a、b、c、d是常量)如果get_magic_number是内联的,那么函数调用可能会被完全删除并替换为它的值。(但您需要查看生成的程序集才能确定)。这看起来确实是一个不错的选择。您认为所有if语句在性能方面是否都会比@Yuushi提到的vector/map实现更好/更差?这将取决于您的编译器选项/功能。(可能还有语句的顺序。)如果您想使用显式版本,您可以将If分支合并在一起,并使用else If
etc获得一些