?
Martin Richter schrieb:
Und noch einer, nicht rekursiv mit einfachen Datentypen...
Für die einfachen Datentypen kannst du das template ja spezialisieren.
knivil schrieb:
@warum nicht so?: Warum uebergibst du die maximale Laenge nicht als Parameter? Endlosschleifen sind nicht so der Bringer.
Im uebrigen vermisse ich eine Iteratorloesung. Ein einfaches ++ sollte dann zur naechsten Kombination fuehren. Das waehre auch sinnvoll, wenn man nicht alle Moeglichkeiten generieren will, sondern sie nach und nach bearbeiten moechte.
Das Problem beim Durchiterieren ist, dass man bei jeder "Stelle" der kombination checken muss, an welchem Ort im Pool sie gerade steht. In meiner Funktion speichere ich das in Positions.
Ein iterativer Ansatz sähe so aus (jetzt lexikalisch korrekt):
#include <vector>
#include <cstddef>
template<typename T>
bool generate_next_combination(const T* pool_beg,
std::size_t length,
std::vector<T>& current_combination,
std::size_t max_length)
{
int j = current_combination.size()-1;
for(; j >= 0; --j) //rückwärts für lexikalische Richtigkeit
{
for(typename std::vector<T>::size_type i = 0; i != length; ++i)
{
if(current_combination[j] == pool_beg[i])
{
if(i+1 != length)
{
current_combination[j] = pool_beg[i+1];
return true;
}
else
current_combination[j] = *pool_beg;
}
}
}
if(j < 0)
{
if(current_combination.size()==max_length)
return false; //vll vector noch clearen
current_combination.insert(current_combination.begin(),*pool_beg); //neues element vorne hinzufügen. Vll anderer Container als vector
}
return true;
}
#include <string>
#include <iostream>
int main()
{
std::string pool = "10";
std::string start_key = "100";
std::vector<char> key (start_key.begin(), start_key.end());
std::sort(pool.begin(), pool.end());
//std::unique(pool.begin(), pool.end());
while( generate_next_combination( &pool[0], pool.size(), key, 4 ) )
std::cout<<std::string(key.begin(), key.end())<<std::endl;
}