next_permutation aber Variationen erzeugen



  • 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 sizeof s sind wie gesagt unnötig.

    Ein

    Array + 2
    

    ist 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 flag will er wohl nur jeden zweiten Durchgang der Schleife kopieren. Statt

    flag = (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 werden

    MFG
    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


Anmelden zum Antworten