0

デジタル エレクトロニクスの問題を C++ STL ベースのプログラムに適応させようとしています。

もともと私は4つの入力C1、C2、C3、C4を持っています。これは、合計 16 の組み合わせがあることを意味します。

0000
0001
.
.
.
1111

によって定義されたマルチマップがあります

typedef std::pair<int, int> au_pair; //vertices
typedef std::pair<int, int> acq_pair; //ch qlty
typedef std::multimap<int, acq_pair> au_map;
typedef au_map::iterator It_au;

いいえ。シミュレーションの数は、 のサイズによって異なりますau_map。例: au_map.size() = 5I に C1、C2、C3、C4、C5 がある場合。したがって、2^5 = 32 ケースです。

例: の場合、au_map.size()=416 ケースのアルゴリズムをシミュレートする必要があります。

for(It_au it = a_map.begin(); it != a_map.end(); it++)
{
  acq_pair it1 = it->second;
  //case 0:
  //C3 = 0, C2 = 0, C1 = 0, C0 = 0 
  //Update it1.second with corresponding C values

  //simulate algorithm

  //case 1:
  //C3 = 0, C2 = 0, C1 = 0, C0 = 1 
  //simulate

  .........
  //case 15: 
  //C3 = 1, C2 = 1, C1 = 1, C0 = 1 
  //simulate

}
4

2 に答える 2

1

最高のアイデアではありません。現在、C1 ~ C4 を手動で設定したり、forループ内にいくつかのシミュレーション ルーチンを記述したりして、多くの無駄な作業を行っています。

それを自動化します。

抽象State-Simulatorマッパーを使用しますSimulator実際には、具体的な機能オブジェクトを表します)。

typedef char State;

struct basic_simulator {
   // You could also pass some other parameters to your
   // simulator
   virtual void operator()(...) = 0
};

struct concrete_simulator : public basic_simulator {
   virtual void operator()(...) {
      // Do something concrete
      // Trolololo
   }
};

typedef basic_simulator Simulator;

この場合、実際のラッパーは次のようになりますstd::map<State, Simulator*> map;


次に行う必要があるのは、 として定義されている状態からC1 ~ C4 の値を取得することcharです。ビット演算子を使用します。

0-15すべての州は、バイナリ ( ) に変換された数値として定義できます2 -> 0010。したがって、C1 ~ C4 の値を取得するには、適切なシフトを行うだけです。

// C1 C2 C3 C4
// -----------
// 1  1  1  1
State state = 15;

for (int i = 3; i >= 0; i--) {
   // State of some of the inputs, defined by one bit
   InputState C_xx = ((state >> i) & 1);
}

次に、これらすべての0-15状態を適切なシミュレート ファンクターにマップするだけです。

std::map<State, Simulator*> mapper;
// Generally speaking, you should use some sort of
// smart pointer here
mapper[0] = new concrete_simulator(...);
mapper[1] = ...

いくつかの状態に対応する 3 つまたは 4 つの具体的なシミュレーターしか持てなかったのは本当に素晴らしいことです。

この場合、実際のシミュレーションを呼び出すと、次のようになります。

  // Fire appropriate simulation object
  (*(mapper[actual_state]))(...);

可能なすべてのシミュレーションを行うことは、すべてのマップ要素を反復することを意味します。


更新: 4つ以上の入力がある状態に同じ手法を使用できます/単一の入力状態が3 つ以上の可能な値を持つことができます。

適切なマッピング関数と状態ジェネレーターを作成するだけです。

于 2010-06-24T14:51:25.043 に答える
0

うーん...forループにさまざまな組み合わせを列挙させてみませんか?

for (size_t i = 0; i != 16; ++i)
{
  bool const c1 = i & 1;
  bool const c2 = i & 2;
  bool const c3 = i & 4;
  bool const c4 = i & 8;

  // your algorithm
}

手で設定するよりも少し簡単です。

于 2010-06-24T15:34:15.140 に答える