任意の定数値にマップする必要がある 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 を使用してこれを達成できますか。概念は非常に単純に思えますが、何らかの理由で、それを行うための適切で効率的な方法が思いつきません。私が試した方法はうまくいかないので、これを実装するためのガイドを探しています。
をstd::map<std::vector<int>, int>
使用して、包含の値が42になるようにします。vector
{4,2,1,1}
編集:std::tuple
C ++ 11をサポートするコンパイラーを使用している場合は、より良い方法であることに同意します。std::vector
おそらくこの段階でよりポータブルであるため、私はを使用しました。を使用することもできますstd::array<int, 4>
。
シンプルな機能で十分ですか?
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
ベースのソリューションでは決してできません。
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;
標準ライブラリ コンテナーの配列で int を整理する場合、より小さい比較にstd::lexicographical_compareを使用できます。
常に 4 つの整数が 1 つの整数にマップされていることがわかっている場合は、次を使用することをお勧めします。
std::map< boost::tuple<int, int, int, int>, int >
タプルの比較 (辞書式) は既に定義されています。