2016-06-02 10 views
1

Ich habe ein Struktur der Person, die zwei Werte enthält - ersten und ersten Vornamen.C++ Finde Objekt Mitglied Wert in Vektor

Es gibt einen Vektor dieser Person Structs.

Ich muss durch den Vektor suchen, um die erste Person mit der passenden ersten Initiale zu finden und den Vornamen von diesem Struct abzurufen.

Meine Forschung unterstreicht die Notwendigkeit, einen überladenen Operator für die Person Struct zu verwenden, aber ich brauche einige Anleitung.

Hinweis: Kann nur einen Vektor und find() Algorithmus verwenden. Kann Boost nicht verwenden.

#include <stdio.h> 
    #include <iostream> 
    #include <stdexcept> 
    #include <vector> 
    #include <algorithm> 
    #include <string> 

    using namespace std; 

    struct person 
    { 
    char firstInitial; 
    string firstName; 

    person(const char fi, const string fn) 
    { 
     firstInitial = fi; 
     firstName = fn; 
    }; 

    char getInitial() 
    { 
     return firstInitial; 
    }; 

    string getName() 
    { 
     return firstName; 
    }; 

    bool operator==(const person& l, const person& r) const 
    { 
     return l.firstInitial == r.firstInitial; 
    } 

    }; 


    int main (int argc, char *argv[]) 
    { 
    vector<person> myvector; 
    vector<person>::iterator itr; 

    myvector.push_back(person('j', "john")); 
    myvector.push_back(person('s', "steve")); 
    myvector.push_back(person('c', "candice")); 

    itr = find (myvector.begin(), myvector.end(), itr->getInitial() == 's'); 

    if (itr != myvector.end()) 
     cout << "First Name: " << itr->getName() << '\n'; 
    else 
     cout << "NOT Found" << '\n'; 
    } 

Antwort

0

1. operator==() sollte eine binäre Funktion sein. Wenn Sie es wollen, eine Member-Funktion sein, sollte es einen Parameter nehmen, wie:

bool operator==(const person& r) const 
{ 
    return firstInitial == r.firstInitial; 
} 

oder ein Nicht-Mitglied-Funktion machen (verschieben Sie sie aus der Klassendeklaration):

bool operator==(const person& l, const person& r) 
{ 
    return l.firstInitial == r.firstInitial; 
} 

2. std::find erwartet, dass sein drittes Argument der Wert zu sein, wird im Vergleich zu Sie, es ändern könnten:

itr = find (myvector.begin(), myvector.end(), person('s', "")); 

LIVE

0

Die operator== Elementfunktion nimmt nur einen Parameter, nicht zwei. Seine Aufgabe besteht darin, this mit einer anderen Instanz der Klasse zu vergleichen, die als einziger Parameter übergeben wird. Der dritte Parameter std::find ist kein boolescher Wert, sondern eine Instanz eines Objekts, das in der zu durchsuchenden Sequenz gefunden werden soll. Alternativ kann ein Lambda als dritter Parameter an std::find_if geliefert werden.