Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将4个整数的组合映射到单个值_C++_Hash_Containers - Fatal编程技术网

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

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

我有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::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)函数并用它初始化映射…@Nemo
operatorYeah我使用std::vector是因为它更便于携带,而且运行良好。谢谢!我猜你实际上还没有尝试过这一点。(std::vector是否可以比较?)如果你知道总是有4个整数,我认为应该使用数组或元组而不是向量,所以定义一个比较(const std::vector&a,const std::vector&b)函数并用它初始化映射…@Nemo
operatorYeah我使用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获得一些