Wer macht mein Schleifenkonstrukt schöner
-
Um dieses Gebilde geht es:
for(unsigned int i=0; i<m_vector.size(); ++i) { bool valid = false; CONTENT content; while(!valid) { valid = true; content = rand()%13; for(unsigned int j=0; j < m_vector.size(); ++j) { if(m_vector[j] && m_vector[j]->GetContent() == content) valid = false; } } // Mach was mit der Variablen "content" }Kann man das auch schöner hinbekommen, falls ja wie
Wäre dankbar dafür 
-
Bitte erkläre mal den Sinn des Ganzen. Die Laufvariable i der äußeren for-Schleife wird überhaupt nicht verwendet, und im inneren erzeugst du sooft eine neue Zufallszahl, bis sie mit dem Inhalt eines Elements eines Vektors übereinstimmt, und verwendest sie dann weiter. Wenn du nur ein zufälliges Element aus dem Vektor haben willst, indiziere ihn besser direkt mit einer Zufallszahl.
Moritz
-
audacia schrieb:
Bitte erkläre mal den Sinn des Ganzen. Die Laufvariable i der äußeren for-Schleife wird überhaupt nicht verwendet,
Doch, am Ende, ich habs hinzugefügt.
audacia schrieb:
und im inneren erzeugst du sooft eine neue Zufallszahl, bis sie mit dem Inhalt eines Elements eines Vektors übereinstimmt, und verwendest sie dann weiter. Wenn du nur ein zufälliges Element aus dem Vektor haben willst, indiziere ihn besser direkt mit einer Zufallszahl.
MoritzFalsch, ich erzeuge solange eine Zufallszahl bis sie mit KEINEM Vektorelement übereinstimmt.
for(unsigned int i=0; i<m_vector.size(); ++i) { bool valid = false; CONTENT content; while(!valid) { valid = true; content = rand()%13; for(unsigned int j=0; j < m_vector.size(); ++j) { if(m_vector[j] && m_vector[j]->GetContent() == content) valid = false; } } // Mach was mit der Variablen "content" // Mach was mit der Variablen "i" }
-
for(unsigned int i=0; i<m_vector.size(); ++i) { bool valid = false; CONTENT content; while(!valid) { valid = true; content = rand()%13; for(unsigned int j=0; j < m_vector.size(); ++j) if(m_vector[j] && m_vector[j]->GetContent() == content) { valid = false; //wenn valid einmal false ist, bleibt es das für die restlichen Elemente auch, also kann man die for-Schleife hier abbrechen break; } } // Mach was mit der Variablen "content" // Mach was mit der Variablen "i" }
-
Wieso das? Wenn danach ein Vectorelement kommt wo sie doch gleich sind dann funktioniert das ganze nicht mehr.
Aber vielleicht ist das auch schwierig eine Schleife zu optimieren wenn man den Hintergrund nicht kennt, dass gebe ich zu

-
^^ schrieb:
Wieso das? Wenn danach ein Vectorelement kommt wo sie doch gleich sind dann funktioniert das ganze nicht mehr.
hö?Ich denke invalid hat gesagt wenn du einmal die if bedinung erfüllst, kannst du
die Schleife abbrechen; und das simmt. Denn wenn dein bool schon false ist, ist es egal ob ein weiterer vergleich ihn nochmal auf false setzten würde, es würde sich nichts ändern und somit ist ein break doch sinnvoll, oder ?
-
also ich versteh des ganze auch net,
wenn die zufallszhal auf kein vector-element verweisen soll,
warum dann nicht sowas in der art
content = rand()%13 + m_vector.size() ?
Was hast du mit der variablen i vor?
-
Ihr habt Recht, mein Fehler

-
^^ schrieb:
Kann man das auch schöner hinbekommen, falls ja wie
Wäre dankbar dafür 
Was ist 'schön'? Das vielleicht:
struct ContentSchonDa { ContentSchonDa( CONTENT c ) : m_c( c ) {} bool operator()( const Foo* foo ) const // Foo sei die Klasse in m_vector { return foo && foo->GetContent() == m_c; } private: CONTENT m_c; }; for( unsigned int i=0; i<m_vector.size(); ++i ) { CONTENT content; do { content = rand()%13; } while( std::find_if( m_vector.begin(), m_vector.end(), ContentSchonDa( content ) ) != m_vector.end() ); // Mach was mit der Variablen "content" // Mach was mit der Variablen "i" }Wenn Du uns noch sagst, ob Du innerhalb der Schleife auch noch 'm_vector' änderst, bzw. eines der Elemente darin, so geht's vielleicht noch 'schöner'
Gruß
Werner