2016-05-04 5 views
0
int main(int argc, char** argv) { 
    set<string> s; 

    s.insert("hi"); 

    set<string>::iterator it = s.find("hi"); 

    if (it == s.end()) { 
     cout << "Matched." << endl; 
    } else { 
     cout << "Not matched." << endl; 
    } 

    return 0; 
} 

Die Ausgabe sagt Nicht übereinstimmend.Speichern von C++ - Zeichenfolgen in AWL-Satz

Ich möchte eine Reihe von eindeutigen Zeichenfolgen speichern. Aber die find() im Set findet die Strings, die ich bereits eingefügt habe, nicht. Funktioniert das default less comparator Objekt nicht für Strings? Wenn nicht, wie ordne ich dann das richtige Vergleicherobjekt für Strings zu?

+1

Anstelle von if (it == send()) verwende if (it! = S.end()), da die Suche einen Iterator an das erste Element in dem Bereich liefert, der val vergleicht ("hi"), wenn keine Elemente übereinstimmen, gibt die Funktion die letzte (s.end()) zurück. –

+0

Übrigens, wenn Sie nur überprüfen müssen, ob ein Element vorhanden ist, ist die 'count' Methode viel weniger ausführlich. –

Antwort

10

Sie haben wahrscheinlich missverstanden, wie find() Funktion funktioniert. Wenn der Rückgabewert gleich am Ende() ist, heißt das nicht, dass es übereinstimmt. Im Gegenteil bedeutet dies, dass die gesuchte Zeichenfolge nicht gefunden werden konnte, bis der Enditerator der Menge erreicht wurde.

Also sollten Sie die if-Anweisung wie unten angegeben umkehren.

if (it == s.end()) { 
    cout << "Matched." << endl; 
} else { 
    cout << "Not matched." << endl; 
} 

zu

if (it != s.end()) { 
    cout << "Matched." << endl; 
} else { 
    cout << "Not matched." << endl; 
} 
+0

danke. verpasst das. – siri

+0

@siri Kein Problem. Wenn Sie mit den bisher gegebenen Antworten zufrieden sind, denken Sie daran, eine davon als Antwort auf Ihre Frage auszuwählen. – ilim

2

Der if Zustand entgegengesetzt ist, sollte es sein

if (it != s.end()) { 
     ~~ 
    cout << "Matched." << endl; 
} else { 
    cout << "Not matched." << endl; 
} 

std::set::find Siehe:

Rückgabewert

Iterator auf ein Element mit Schlüssel äquivalent zu drücken. Wenn kein solches Element gefunden wird, wird der Iterator über die letzten (siehe end()) zurückgegeben.

1

Wenn find("hi") gleich s.end() es bedeutet nicht, dass es angepasst ist. Im Gegenteil bedeutet dies, dass die gesuchte Zeichenfolge nicht gefunden werden konnte, bis der Enditerator der Menge erreicht wurde.