find()



  • 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?



  • 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 das remove bezieht, und nicht auf das copy_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 ist copy_if .


Anmelden zum Antworten