find()
-
find7 = std::find(v.begin(), v.end(), 7);
Das ist falsch. Lies nochmal den Thread durch.
vector<int> mod7; for( vector<int>::iterator it = find_if(v.begin(), v.end(), div); it != v.end(); it = std::find_if(++it, v.end(), div) ) { mod7.push_back(*it); }
Ich hab dir doch schon
std::remove_copy_if
empfohlen. Lies - meine- Posts, du verkomplizierst deinen Code unnötig.
-
Sone schrieb:
Find schrieb:
Funktioniert das mit dem "finde die 7" nicht?
Natürlich! Aber der Rückgabewert ist doch ein Iterator, und ein std::vector hat selbstverständlich keinen
operator=(iterator a)
...Dann hab ich das falsch verstanden..
-
Find schrieb:
Sone schrieb:
Find schrieb:
Funktioniert das mit dem "finde die 7" nicht?
Natürlich! Aber der Rückgabewert ist doch ein Iterator, und ein std::vector hat selbstverständlich keinen
operator=(iterator a)
...Dann hab ich das falsch verstanden..
Was ich meine: Du kannst einen Iterator keinem Container zuweisen.
-
Es bleibt trotzdem der selbe Fehler..
-
Find schrieb:
Es bleibt trotzdem der selbe Fehler..
Welche Zeile denn?
-
vector<int> mod7; for ( vector<int>::iterator it = std::remove_copy_if(v.begin(), v.end(), div); it != v.end(); it = std::remove_copy_if(++it, v.end(), div) ) { mod7.push_back(*it); }
Zeile 2
-
for ( vector<int>::iterator it = std::remove_copy_if(v.begin(), v.end(), div); it != v.end(); it = std::remove_copy_if(++it, v.end(), div) ) { mod7.push_back(*it); }
Was zur Hölle-?
Du sollst anstatt der Schleifestd::remove_copy_if
verwenden! Nichtfind_if
ersetzen...
-
Sone schrieb:
Dein erstes Beispiel ist doch falsch
Ja, weil not1 keine Funktionen unterstützt, sondern nur Funktoren. Die Logik stimmt aber: http://ideone.com/QVtQa (Edit: Hier ist man natürlich besser dran, wenn man die Funktion einfach ändert )
(und irgendwie unnötig)
Warum? Wenn man kein C++11 hat...
und wieso ein
back_inserter
? Er will doch einfach in einen anderen Container, alsomod_7.end()
?Das fliegt dir auf leeren Containern böse um die Ohren.
-
Michael E. schrieb:
Sone schrieb:
Dein erstes Beispiel ist doch falsch
Ja, weil not1 keine Funktionen unterstützt, sondern nur Funktoren. Die Logik stimmt aber: http://ideone.com/QVtQa (Edit: Hier ist man natürlich besser dran, wenn man die Funktion einfach ändert )
(und irgendwie unnötig)
Warum? Wenn man kein C++11 hat...
Du hast da einfach ein paar Klammern vergessen usw.
back_inserter(mod_7, not1(check_mod_7))
Ich dacht schon,
back_inserter
hat doch nicht zwei Konstruktor-argumente?
-
Jaja, Klammern dürfen gerne umgesetzt werden Siehe den ideone-Code.
-
Michael E. schrieb:
Gugelmoser schrieb:
for( vector<int>::iterator it = std::find_if(v.begin(), v.end(), check_mod_7); it != v.end(); it = std::find_if(++it, v.end(), check_mod_7) ) { mod_7.push_back(*it); }
remove_copy_if(v.begin(), v.end(), back_inserter(mod_7, not1(check_mod_7)));
Bzw. mit C++11:
copy_if(begin(v), end(v), back_inserter(mod_7);
Edit: Tab aktualisieren vorm Beantworten, wenn er schon etwas älter ist...
Wieso? Mehrfach schadet nicht. Ich find die Antwort gut. Man sieht genau, wie der Quellcode abstrakter wird. Also versteck dich nicht.
-
Jetzt bin ich komplett verwirrt, was macht denn dieses notl
-
Find schrieb:
Jetzt bin ich komplett verwirrt, was macht denn dieses notl
Das ist ein Funktor.
-
Michael E. schrieb:
remove_copy_if(v.begin(), v.end(), back_inserter(mod_7, not1(check_mod_7)));
Wenn ich mir das so genauer anschaue, kommt es mir jede weitere Sekunde noch merkwürdiger vor, dass der Algorithmus remove_copy_if heißt, das Prädikat jedoch zu negieren ist. Irgendwie ein misslungener Name für diesen Algorithmus, finde ich. Oder was meint ihr?
-
Gugelmoser schrieb:
Michael E. schrieb:
remove_copy_if(v.begin(), v.end(), back_inserter(mod_7, not1(check_mod_7)));
Wenn ich mir das so genauer anschaue, kommt es mir jede weitere Sekunde noch merkwürdiger vor, dass der Algorithmus remove_copy_if heißt, das Prädikat jedoch zu negieren ist. Irgendwie ein misslungener Name für diesen Algorithmus, finde ich. Oder was meint ihr?
Ich verstehe überhaupt nicht was du meinst.
remove_copy_if
ist eindeutig, das Prädikat frei wählbar...
-
Sone schrieb:
Ich verstehe überhaupt nicht was du meinst.
Was ich meine? Instinktiv hätte ich das so gemacht:
remove_copy_if( v.begin(), v.end(), back_inserter(mod_7), check_mod_7 );
-
Gugelmoser schrieb:
Sone schrieb:
Ich verstehe überhaupt nicht was du meinst.
Was ich meine? Instinktiv hätte ich das so gemacht:
remove_copy_if( v.begin(), v.end(), back_inserter(mod_7), check_mod_7 );
Und was ist das Problem? Michaels Code ist doch einfach anders, er nimmt ein anderes Prädikat- wo hackts?
-
Sone schrieb:
Gugelmoser schrieb:
Sone schrieb:
Ich verstehe überhaupt nicht was du meinst.
Was ich meine? Instinktiv hätte ich das so gemacht:
remove_copy_if( v.begin(), v.end(), back_inserter(mod_7), check_mod_7 );
Und was ist das Problem? Michaels Code ist doch einfach anders, er nimmt ein anderes Prädikat- wo hackts?
Ich finde es merkwürdig, dass sich das
Prädikat
auf dasremove
bezieht, und nicht auf dascopy_if
.
Mit anderen Worten: Ich fände es logischer, wenn die Werte, die mit dem Prädikat übereinstimmen, nicht aussortiert werden.
-
Gugelmoser schrieb:
Mit anderen Worten: Ich fände es logischer, wenn die Werte, die mit dem Prädikat übereinstimmen, nicht aussortiert werden.
Hä? Deswegen doch das
remove_
präfix. WAs du meinst istcopy_if
.
-
Sone schrieb:
Gugelmoser schrieb:
Mit anderen Worten: Ich fände es logischer, wenn die Werte, die mit dem Prädikat übereinstimmen, nicht aussortiert werden.
Hä? Deswegen doch das
remove_
präfix. WAs du meinst istcopy_if
.#include <iostream> #include <algorithm> #include <iterator> #include <vector> using namespace std; bool is_even(int value) { return value%2==0; } int main() { int ar[] = { 0,1,2,3,4,5,6,7,8,9 }; vector<int> numbers(ar,ar+10); vector<int> specific_numbers; remove_copy_if( numbers.begin(), numbers.end(), back_inserter(specific_numbers), is_even ); for(vector<int>::iterator it=numbers.begin(); it!=numbers.end(); ++it) cout << *it << " "; cout << endl; for(vector<int>::iterator it=specific_numbers.begin(); it!=specific_numbers.end(); ++it) cout << *it << " "; }
Ich hoffe du verstehst jetzt, was ich meine. Ich will alle geraden Zahlen kopieren. Der Algorithmus hat aber alle ungeraden Zahlen kopiert, ergo bezieht sich das Prädikat nicht auf
copy
(Element beibehalten) sondern aufremove
(Element aussortieren), ergo muss ich das Prädikat negieren (und das finde ICH irreführend).So, lassen wir es dabei. :p