2010-05-18 3 views
0

Можно создать дубликат:
Howto create combinations of several vectors without hardcoding loops in C++?перечислить все комбинации в C++

Мой вопрос похож на this combinations question, но в моем случае, у меня есть N (N> 4) небольшие наборы (1-2 элементы для набора теперь могут перейти на 3, возможно, 4) и хотят генерировать каждую комбинацию из одного элемента из каждого набора.

Текущее решение выглядит somethinging вдоль линий этого

for(T:: iterator a = setA.begin(); a != setA.end(); ++a) 
for(T:: iterator b = setB.begin(); b != setB.end(); ++b) 
    for(T:: iterator c = setC.begin(); c != setC.end(); ++c) 
    for(T:: iterator d = setD.begin(); d != setD.end(); ++d) 
    for(T:: iterator e = setE.begin(); e != setE.end(); ++e) 
    something(*a,*b,*c,*d,*e); 

Простой, эффективный, вероятно, достаточно эффективным, но некрасивой и не очень расширяемой. Кто-нибудь знает о более эффективном/чистом способе сделать это так же быстро?

Идеальное решение будет выглядеть как один цикл и исходить из некоторой хорошо поддерживаемой библиотеки.

Combinations<T> comb; 
comb.set(0) = setA; 
comb.set(1) = setB; 
comb.set(2) = setC; 
comb.set(3) = setD; 
comb.set(4) = setE; 

for(Combinations<T>::iterator a = comb.begin(); a != comb.end(); ++a) 
    something(*a[0],*a[1],*a[2],*a[3],*a[4]); 
+0

Мне нравится решение Sumudu Fernando на этот вопрос – BCS

ответ

1

Если вам нужна необработанная производительность (=> нет рекурсии) и длина комбинации известен только во время выполнения, есть this code of mine, что вы можете адаптировать.

В противном случае в его комментарии есть более элегантные решения, такие как те, которые связаны с KennyTM.

Смежные вопросы