2017-11-09 2 views
-3

entschuldigen Sie mich zuerst für mein Englisch, ist nicht meine Muttersprache. Ok, so in der Universität, sie lehren mich einfach Vektoren in C++. Ich arbeite an einem Projekt, wo ich eine Taschenklasse und eine Schmuckklasse habe. Ich versuche in einer Funktion, in die Tasche zu suchen, wenn bestimmte Schmuckstücke existieren, wenn ja, gibt den Index des Schmuckstücks zurück und, wenn nicht, gibt -1 zurück. Wie kann ich innerhalb der Vektoransammlung finden; wenn ein bestimmtes Schmuckstück existiert und es innerhalb des Vektors zurückgibt? Hinweise:Versuchen, eine Zeichenfolge in einem Vektor einer Klasse zu finden

  • Vektor-Sammlung ein eigenes Attribut der Klasse Tasche ist.
  • Klasse Trinket, haben Name, Gewicht und Wert private Attribute.
  • Ich habe versucht, dies zu tun, aber nicht funktioniert:

    int Bag::searchTrinket(string name){ 
         vector<Trinket>::iterator it =find(colleccion.begin(),colleccion.end(), name); 
         int pos = 0; 
         if(it != colleccion.end()){ 
    
          cout << "Trinket found in position : "; 
          pos = distance(coleccion.begin(), it); 
          cout << pos << endl; 
         } else{ 
         return -1; 
         } 
        } 
    

    Im Voraus, Vielen Dank!

+0

Was bedeutet „doesn‘ t Arbeit "gemein? – scohe001

+0

Warum funktioniert es nicht? Was ist das Verhalten, das du beobachtest? –

+1

Mögliches Duplikat von https://stackoverflow.com/questions/28925349/find-in-vector-of-a-struct – Galik

Antwort

0

Sie haben einen Vektor von Trinket Objekte, nicht einen Vektor von std::string Werte, so kann man nicht std::find() verwenden. Verwenden Sie stattdessen std::find_if(), damit Sie angeben können, wie Sie die gewünschte Zeichenfolge in jedem Trinket erreichen.

Außerdem gibt searchTrinket() nichts zurück, wenn die Zeichenfolge gefunden wird, daher ist der Rückgabewert nicht definiert.

versuchen, etwas wie folgt aus:

/* assuming: 
class Trinket 
{ 
private: 
    std::string name; 
    ... 
public: 
    std::string getName() const { return name; } 
    ... 
}; 
*/ 

struct hasName 
{ 
    std::string &m_name; 
    hasName(std::string &name) : m_name(name) {} 
    bool operator()(const Trinket &t) const { return (t.getName() == m_name); } 
}; 

int Bag::searchTrinket(std::string name) 
{ 
    std::vector<Trinket>::iterator it = std::find_if(colleccion.begin(), colleccion.end(), hasName(name)); 
    if (it != colleccion.end()) 
    { 
     int pos = std::distance(coleccion.begin(), it); 
     std::cout << "Trinket found at position : " << pos << std::endl; 
     return pos; 
    } 
    else 
    { 
     std::cout << "Trinket not found" << std::endl; 
     return -1; 
    } 
} 

Wenn Sie C++ 11 oder höher verwenden, und eine lambda nutzen, versuchen Sie stattdessen:

auto it = std::find_if(colleccion.begin(), colleccion.end(), 
         [&name](auto &t) { return (t.getName() == name); }); 
+0

Vielen Dank, es hat jetzt funktioniert! –

Verwandte Themen