find()



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



  • 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 ist copy_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 auf remove (Element aussortieren), ergo muss ich das Prädikat negieren (und das finde ICH irreführend).

    So, lassen wir es dabei. :p



  • Gugelmoser schrieb:

    [/cpp] 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 auf remove (Element aussortieren), ergo muss ich das Prädikat negieren (und das finde ICH irreführend).

    So, lassen wir es dabei. :p

    Ja, jetzt verstehe ich dich; und ich finde, du hast Recht. Es ist halt bescheuert, dass es kein std::copy_if in C++03 gibt...



  • So, ich hab mir das ganze nochmal zu gemüte geführt.

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <functional>
    #include <iterator>
    
    using namespace std;
    
    int div7(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;
    		remove_copy_if(v.begin(), v.end(), back_inserter(mod7), not1(div7));
    
    		for (auto it = mod7.begin(); it != mod7.end(); ++it) 
    		{
    			cout << *it << endl;
    		}
    
    		vector<int> find7;
    		find(v.begin(), v.end(), 7);
    
    		for (auto it = find7.begin(); it != find7.end(); ++it) 
    		{
    			cout << *it << endl;
    		}
    
    	}
    
    	//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;
    }
    

    Hab aber jetzt noch eine Fehlermeldung mit der ich absolut nichts anfangen kann

    Fehler 9 error C2664: 'std::remove_copy_if': Konvertierung des Parameters 4 von 'std::unary_negate<_Fn1>' in 'std::unary_negate<_Fn1>' nicht möglich



  • Die Fehlermeldungen sind immer lustig, wenn man X nicht in X konvertieren kann. 😃

    remove_copy_if(v.begin(), v.end(), back_inserter(mod7), not1(std::ptr_fun(div7)));
    

Anmelden zum Antworten