next_permutation aber Variationen erzeugen
-
Shade Of Mine schrieb:
arr+2*sizeof(*arr)
erklärung dafür?
Da geht er genau zwei Objekte weiter. Blödsinn. Nein, tut er nicht.
-
Tachyon schrieb:
Shade Of Mine schrieb:
arr+2*sizeof(*arr)
erklärung dafür?
Da geht er genau zwei Objekte weiter. Blödsinn. Nein, tut er nicht.
doch tut er

aber es ist n bisschen doof, weils für int plötzlich nicht mehr geht
-
nja, sollte ein Zeiger auf "zwei Elemente weiter" sein.. ja, is etwas schraeg...
Aber ich weiss auch nicht ob die Sache mit dem bool im alg. so toll is. War nur'n Vorschlag, den ich aus einem Codefetzen den ich irgendwo hatte, zusammengeschnitzt hab und der zufaellig funktionierte

-
Shade Of Mine schrieb:
Tachyon schrieb:
Shade Of Mine schrieb:
arr+2*sizeof(*arr)
erklärung dafür?
Da geht er genau zwei Objekte weiter. Blödsinn. Nein, tut er nicht.
doch tut er

aber es ist n bisschen doof, weils für int plötzlich nicht mehr geht
[Korinthenkacker-Mode]
Ne, tut es nicht. Zwei char-Objekte, ja, aber nicht zwei (beliebige) Objekte.
[/Korinthenkacker-Mode]Fabeltier schrieb:
nja, sollte ein Zeiger auf "zwei Elemente weiter" sein.. ja, is etwas schraeg...
Ohne das
sizeof(*arr)wärs besser.
-
Hmm...
Vielen Dank erstma.
Ich weis ihr sollt nicht meine Arbeit machen, aber könnte das jemand vielleicht nochmal für einen vector<char> posten.
Lerne jetzt gerade mit Iteratoren zu arbeiten und hab next_permutation immer mit (v.begin(), v.end()) aufgerufen.
Mit den sizeof's kann ich mir nix darunter vorstellen.
MFG
Ace
-
Die
sizeofs sind wie gesagt unnötig.Ein
Array + 2ist semantisch äquivalent zu
Container.begin() + 2(Random-Access-Iterator vorausgesetzt).
-
Edit: OK funktioniert einwandfrei, aber ich hab immer noch nicht verstanden wie.
Was macht das Copy und warum braucht man flag?
MFG
Ace
-
Mit
flagwill er wohl nur jeden zweiten Durchgang der Schleife kopieren. Stattflag = (flag ? false : true);wäre
flag = !flag;allerdings ein wenig einfacher...
Und zu
std::copy()findest du auf www.cplusplus.com Informationen.
-
Hmm ok habs jetzt vestanden. Die Lösung funktioniert aber nur wenn man genau 2 weniger Elemente als ingesamt vorhanden kombinieren will.
Deshalb nochmal meine Lösung für jede Art von variation:
unsigned long factorial(unsigned n){ //Fakultät unsigned long value = 1; for(unsigned i = n; i > 0; i--) value = value * i; return value; } template<class RandomAccessIterator, class OutputIterator> bool next_variation(RandomAccessIterator first, RandomAccessIterator last, OutputIterator output, unsigned n, unsigned k){ unsigned long fact = factorial(n-k); for(unsigned i = 0; i < fact; i++) if(!std::next_permutation(first, last)) return false; copy(first, first+k, output); return true; }n: Die Anzahl aller Elemente
k: Die Anzahl Elemente, die bei einem Durchgang kombiniert werdenMFG
Ace
-
sieht ja böse aus...
uU liegt es daran dass next_permutation hier einfach die falsche wahl ist...und btw:
n == distance(first, last)
-
Jetzt musst du aber auch sagen was böse ist und wie man es besser macht

MFG
Ace
-
AceKiller73 schrieb:
Jetzt musst du aber auch sagen was böse ist und wie man es besser macht

Ist es denn garantiert dass dein Code funktioniert? Darf die STL nicht permutation in beliebiger Reihenfolge erstellen? Mal davon abgesehen dass enorm viele sinnlose Permutationen erstellt werden...
ich wuerde es einfach haendisch machen...
-
Also next_permutation erzeugt keine zufälligen Permutationen, sondern die "lexicographically next greater permutation".
Ich wollte es erst auch händisch machen wusste aber nicht wie.
Wie willst du das denn machen? Nur rein theoretisch.
MFG
Ace