vector <eigene Klasse> mit find durchsuchen



  • #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    class person
    {
    	private:
    	int pnr;
    	string name;
    	public:
    	person(int nr,string nachname):pnr(nr),name(nachname){}
    	person(){}
    	int get_pnr()
    	{
    		return pnr;
    	}
    	string get_name()
    	{
    		return name;
    	}
    	bool is_persnr(int nr)
    	{
    		return pnr==nr;
    	}
    };
    
    int _main()
    {
    	vector <person> leute;
    	leute.push_back(person(1,"Arne"));
    	leute.push_back(person(2,"Fred"));
             //Das funktioniert natürlich nicht
    	vector <person>::iterator it=find(leute.begin(),leute.end(),person::is_persnr(2));
    	return 0;
    }
    

    Hallo,
    habe einen vector mit meiner eigenen Klasse.
    Nun möchte ich diesen vector nach z.B wie hier der pnr durchsuchen.
    Bekomme ich das mit find hin, oder muss ich durch den vecor iterieren und dann
    "von Hand" vergleichen ?



  • Mach in person einen Vergleichsoperator mit int und übergib als dritter Parameter bei std::find den gewünschten Wert (in diesem Fall zwei).



  • Hallo,

    das Stichwort dafür lautet: Funktor
    s. z.B. http://www.c-plusplus.net/forum/277536

    Wenn du schon einen neueren Compiler hast, dann könntest du auch Lambda-Expressions verwenden, so in der Art

    find(leute.begin(),leute.end(), [](p){ return p.is_persnr(2); });
    


  • Ich würde es etwa so machen:

    class Person
    {
      private:
        int ID;
      public:
        explicit Person(int ID)
        {
          this->ID = ID;
        }
        bool operator== (const Person& Obj) const
        {
          return this->ID == Obj.ID;
        }
    };
    typedef std::vector<Person> Container;
    Container MeinVector;
    //Vector füllen
    Container::iterator PersonNo2 = std::find(MeinVector.begin(), MeinVector.end(), Person(2));
    


  • Th69 schrieb:

    find(leute.begin(),leute.end(), [](p){ return p.is_persnr(2); });
    

    Fast richtig. Das Template hierfür heißt find_if .



  • Danke. 👍
    "Funktor" das wars.


Anmelden zum Antworten