find()



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



  • 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. 🙂


Anmelden zum Antworten