0

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

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

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

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

for(size_t i = 0; i != 16; ++i)
{
  for(It_au it = a_map.begin(); it != a_map.end();)
  {
    acq_pair it1 = it->second;
    //case 0:
    //C1 = 0, C2 = 0, C3 = 0, C4 = 0
    //@Matthieu M 's suggestion http://stackoverflow.com/questions/3110975/c-case-declaration-closed
    //bool const c1 = i & 1;
    //bool const c2 = i & 2;
    //bool const c3 = i & 4;
    //bool const c4 = i & 8;
    //Update it1.second with corresponding C values
    it->second.second = C1;
    it++;
    it->second.second = C2;
    it++;
    it->second.second = C3;
    it++;
    it->second.second = C4;
    it++;
  }
  //simulate algorithm
}

Cのサイズがに応じて変化するこのプロセスを自動化するにはどうすればよいau_map.size()ですか?したがって、C1、C2、C3、C4の場合はau_map.size() = 4、C1、C2、C3、C4、C5の場合になりau_map.size() = 5ます。

また、これらの値を持つベクトル、またはこれをマルチマップ内のペアに追加するのが好ましいのは何ですか?ベクトルルックアップ時間はマルチマップよりも短くなります。

また、マルチマップに値を挿入し続けると、新しい/更新された値がアルゴリズムに渡されますか?

4

3 に答える 3

1

他の人たちと同じように、あなたの質問を完全に理解しているとは言えません。bits必要なのは、便利に参照できる0 から 2 -1 までの各整数のバイナリの表現だけのようです (言及した場合bits、4 または 5 のいずれかですが、一般化する必要があります)。その場合、構造体の管理とアクセスがより簡単なのは bool ベクトルのベクトルになります。std::multimapつまり、 の一般的な値に対してを使用するのではなく、 を...のようなものbitsに置き換えます。std::multimapstd::vector<std::vector<bool> >

std::vector<std::vector<bool> > c_flags(1 << bits);

for (size_t i = 0; i < c_flags().size(); ++i)
{
    for (size_t j = 0; j < bits; ++j)
        c_flags[i].push_back( (i & (1 << j)) > 0);
}

この時点で、と はそれぞれ 1 と 0に対応する場所c_flags[i]の 2 進数を表す bool のベクトルを含みます。itruefalse

std::map<std::vector<bool> >の代わりにa を使用することもできますstd::vector<std::vector<bool> >。これは、計算コストが高くなるという犠牲を払って、メモリ要件を減らす可能性があります (考えられるすべてのバイナリ表現が必要でない場合)。を使用する必要がある理由はわかりstd::multimapませんが、対処しようとしている問題の詳細についてはあまり洞察がありません。

于 2010-06-28T15:43:36.953 に答える
0

C1、C2 などとは何ですか? それらは単に int ですか、それとも文字列ですか? その場合、カウンター変数を保持することでそれらを自動的に生成できます。マルチマップの内側
が必要なのはなぜですか? 最後の質問がわかりません。pair<int,int>

于 2010-06-28T14:58:43.983 に答える
0

軽視するつもりはありませんが、最も紛らわしい質問をします。この質問をもう少しよく理解するために、以前の質問を掘り下げなければなりませんでした。以前の質問を理解したかどうかもわかりません。

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

0000 0001 . . . 1111

Cのサイズが変化するこのプロセスを自動化するにはどうすればよいですか [...]

通常、最も簡単な方法は、ネストされたループを記述して組み合わせを生成することです (これはあなたが望むものではないことはわかっています。読み続けてください)。

for (int a=0; a < 2; ++a)
{
    for (int b=0; b < 2; ++b)
    {
        for (int c=0; c < 2; ++c)
        {
            for (int d=0; d < 2; ++d)
            {
                // I'm just printing the values here but
                // you could insert them to a container if 
                // you want.
                cout << a << b << c << d << endl;
            }
        }
    }
}

ただし、事前に記述する必要があるネストされたループの数を決定できない場合 (例: C のサイズが実行時の条件に基づいている場合)、組み合わせを生成するための再帰的なソリューションを検討してください。

void generate_combinations(int depth, int max_depth, string str)
{
    if (depth < max_depth)
    {
        generate_combinations(depth + 1, max_depth, str + "0");
        generate_combinations(depth + 1, max_depth, str + "1");
    }
    else
        cout << str << " ";
}

int main()
{
    generate_combinations(0, 3, "");
}

これは以下を出力します:

000 001 010 011 100 101 110 111

これの間:

generate_combinations(0, 4, "");

出力:

0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

... 等々。ランタイム条件に基づいて、好きなように C を制御できます。非常に簡単です。

また、これらの値を持つベクトルを優先するか、これをマルチマップ内のペアに追加しますか? ベクトル ルックアップ時間は、マルチマップよりも短くなります。

データが密集している場合 (例: ギャップのない 0 から N の範囲のインデックス)、int キーでマップを使用する理由はありません。整数キーを持つマップの使用は、表現したいデータがまばらな場合にのみ役立ちます。それ以外の場合は、std::vector または std::deque を検討してください。

于 2010-06-28T15:22:46.823 に答える