0

任意の定数値にマップする必要がある 4 つの個別の整数があります。

たとえば、4,2,1,1 は数値 42 にマップされます。

そして、4、2、1、2 という数字は 86 という数字にマッピングされます。

とにかく、#define または何らかの std::map を使用してこれを達成できますか。概念は非常に単純に思えますが、何らかの理由で、それを行うための適切で効率的な方法が思いつきません。私が試した方法はうまくいかないので、これを実装するためのガイドを探しています。

4

4 に答える 4

2

std::map<std::vector<int>, int>使用して、包含の値が42になるようにします。vector{4,2,1,1}

編集:std::tupleC ++ 11をサポートするコンパイラーを使用している場合は、より良い方法であることに同意します。std::vectorおそらくこの段階でよりポータブルであるため、私はを使用しました。を使用することもできますstd::array<int, 4>

于 2012-08-29T05:13:27.250 に答える
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ベースのソリューションでは決してできません。

于 2012-08-29T06:10:28.057 に答える
1

boost::tuplestd::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を使用できます。

于 2012-08-29T05:41:12.763 に答える
0

常に 4 つの整数が 1 つの整数にマップされていることがわかっている場合は、次を使用することをお勧めします。

std::map< boost::tuple<int, int, int, int>, int >

タプルの比較 (辞書式) は既に定義されています。

于 2012-08-29T05:24:48.003 に答える