find()
-
Hallo,
normal suche ich ja so:
vector<int>::iterator find7; find7 = std::find(v.begin(), v.end(), 7);
(Hier nach einer 7)
Kann man statt der 7 auch eine Methode angeben?Ich möchte nicht nur 7 finden, sondern auch alle Zahlen, die durch 7 teilbar sind.
-
vector<int>::iterator find7; find7 = std::find(v.begin(), v.end(), 7);
Das funktioniert nicht.
Zu deinem "Problem" gibt es eine schnelle und klare Antwort:
http://www.cplusplus.com/reference/algorithm/find_if/
Also z. B.:
bool isDivisible7(int a) { return !(a % 7); } std::vector<int> my; //.... std::vector<int>::iterator iter = std::find_if(my.begin(), my.end(), isDivisible);
-
Funktioniert das mit dem "finde die 7" nicht?
-
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)
...
-
#include <algorithm> #include <vector> using namespace std; bool check_mod_7(int zahl) { return zahl%7==0; } int main() { int ar[] = { 5,7,14,21,28,29}; vector<int> v(ar,ar+6); vector<int> mod_7; 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); } }
-
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); }
std::remove_copy_if
und (C++11)std::copy_if
-
Lieder funktioniert das noch nicht so ganz wie ich möchte
#include <iostream> #include <vector> #include <algorithm> #include <cstring> using namespace std; int div(int n) { return ((n%7)==0); } int main() { vector<int> v; for (int i = 1; i < 100; i++) { int count = 0; v.push_back(i); vector<int>::iterator find7; find7 = std::find(v.begin(), v.end(), 7); vector<int>::iterator div7; div7 = std::find(v.begin(), v.end(), div); } //Vektor 2 vector<int> v2(1000); for (int j = 0; j < 1000; j++) { //Füll mit Zahlen v2.push_back((((int)rand()/RAND_MAX)*101)); } int mat = 39; //suche nach Matrikelnummer vector<int>::iterator it; it = find(v2.begin(), v2.end(), mat); //while (it != v2.end()) { //Gib das nächste Element aus cout << "Naechste Element: " << *it++ << endl; system("pause"); return 0; }
Das Funktionsargument in Zeile 31 soll angeblich mehrdeutig sein!?
-
Natürlich find --> find_if
-
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...
-
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);
Dein erstes Beispiel ist doch falsch (und irgendwie unnötig), und wieso ein
back_inserter
? Er will doch einfach in einen anderen Container, alsomod_7.end()
?Zum TE: Welche Zeile 31?
-
Ja, Verzeihung.
#include <iostream> #include <vector> #include <algorithm> #include <cstring> using namespace std; int div(int n) { return ((n%7)==0); } int main() { vector<int> v; for (int i = 1; i < 100; i++) { int count = 0; v.push_back(i); 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); } //vector<int> find7; //find7 = std::find(v.begin(), v.end(), 7); //vector<int> div7; //div7 = std::find_if(v.begin(), v.end(), div); } //Vektor 2 vector<int> v2(1000); for (int j = 0; j < 1000; j++) { //Füll mit Zahlen v2.push_back((((int)rand()/RAND_MAX)*101)); } int mat = 39; //suche nach Matrikelnummer vector<int>::iterator it; it = find(v2.begin(), v2.end(), mat); //while (it != v2.end()) { //Gib das nächste Element aus cout << "Naechste Element: " << *it++ << endl; system("pause"); return 0; }
Fehler 1 error C2914: "std::find_if": template-Argument kann nicht hergeleitet werden, da das Funktionsargument mehrdeutig ist.
-
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?