n 値のベクトルがあるとします。たとえば、その値のさまざまな組み合わせを取得したいとします。vect = [a, b, c] の場合、必要なさまざまな組み合わせは [a, b, c] です。 、[a,b]、[a,c]、[b,c]、[a]、[b]、[c]
たとえば [a,b] は [b,a] と同じなので、両方を保持する必要はありません。
0
からまで数え2^vector.size() - 1
ます。ループ変数のビットiが1の場合はvector[i]
、組み合わせに含めます。
vector<char> v;
v.push_back('a');
v.push_back('b');
v.push_back('c');
for (int counter = 0; counter < (1 << v.size()); ++counter)
{
vector<char> combination;
for (int i = 0; i < v.size(); ++i)
{
if (counter & (1 << i))
combination.push_back(v[i]);
}
// do something with combination
}
編集:空のセットを除外する場合は、1からカウントを開始します。
すでにこれを実行できる関数があると想像してください。と呼びましょうcombinations
。
これの独自のバージョンを実装する場合はmy_combinations
、ベクトルの最初の要素を調べ、残りのベクトルを呼び出しcombinations
、要素を各組み合わせで結合することで実行できます。
combinations
これを実装すると、既存のバージョンを使用する代わりに、独自のバージョンの に委任できます。
疑似コードを渡して、実際のコードに変換してください。
vector resultVec;
while (!inputVec.empty)
{
char c = inputVec.pop_back();
foreach(one in resultVec)
{
combined = combine c and one;
resultVec.push_back(combined);
}
resultVec.push_back(c);
}