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, also mod_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 Schleife std::remove_copy_if verwenden! Nicht find_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, also mod_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?


Log in to reply