if
Anweisung sieht zu peinlich, weil ich eine Möglichkeit brauche, die Anzahl der Konstaanten zu erhöhen. Entschuldigung dafür, dass ich dich durch diese "Konstante" in die Irre führe, anstatt, was ich meinte.Was ist der beste Weg, eine String-Variable mit einer Reihe von String-Konstanten zu vergleichen?
Antwort
Setzen Sie die zu vergleichenden Strings in einen statischen Vektor oder Satz und verwenden Sie dann den std :: find-Algorithmus.
alle Konstanten zu einem std hinzufügen :: set, dann können Sie prüfen, ob der Satz mit
Zeichenfolge enthältstd::set<std::string> myLookup;
//populate the set with your strings here
set<std::string>::size_type i;
i = myLookup.count(searchTerm);
if(i)
std::cout << "Found";
else
std::cout << "Not found";
Scott Meyers würde vorschlagen, dass Sie hier "zählen" anstatt "finden" verwenden. Es ist auch weniger Code. –
Und er hätte recht gehabt. Ich habe nur vergessen, zählen, ich habe nicht lange verwendet.Ich werde meine Antwort aktualisieren – Glen
Denken Sie daran, dass das Set sollte statisch und gefüllt sein, nur wenn es leer ist oder nur sicherstellen, dass es für Sie verfügbar ist aber nur einmal gefüllt, wenn Sie es effizient arbeiten möchten;) – RnR
const char * values[]= { "foo", "bar", ..., 0 };
bool IsValue(const std::string & s) {
int i = 0;
while(values[i]) {
if (s == values[i]) {
return true;
}
i++;
}
return false;
}
Oder eine std :: set.
Hängt davon ab, ob Ihnen die Leistung wichtig ist.
Wenn nicht, dann ist der einfachste Code wahrscheinlich die verschiedenen Strings in ein Array (oder Vektor, wenn Sie wollen, dass Sie die Anzahl der Konstanten zur Laufzeit erhöhen wollen). Dies wird auch für eine kleine Anzahl von Saiten ziemlich schnell sein:
static const char *const strings[] = { "fee", "fie", "fo", "fum" };
static const int num_strings = sizeof(strings)/sizeof(char*);
dann entweder:
int main() {
const char *search = "foe";
bool match = false;
for (int i = 0; i < num_strings; ++i) {
if (std::strcmp(search, strings[i]) == 0) match = true;
}
}
Oder:
struct stringequal {
const char *const lhs;
stringequal(const char *l) : lhs(l) {}
bool operator()(const char *rhs) {
return std::strcmp(lhs, rhs) == 0;
}
};
int main() {
const char *search = "foe";
std::find_if(strings, strings+num_strings, stringequal(search));
}
[Warnung: Ich habe nicht den obigen Code getestet , und ich habe die Signaturen schon mehrmals falsch ...]
Wenn Sie sich um Leistung kümmern, und es gibt eine Reas onable Anzahl der Strings, dann wäre eine schnelle Option so etwas wie ein Trie. Aber das ist eine Menge Aufwand, da es in der C++ - Standardbibliothek keinen gibt. Sie können viel von dem Vorteil erhalten entweder ein sortiertes Array/Vektor verwendet, suchten mit std::binary_search
:
// These strings MUST be in ASCII-alphabetical order. Don't add "foo" to the end!
static const char *const strings[] = { "fee", "fie", "fo", "fum" };
static const int num_strings = sizeof(strings)/sizeof(char*);
bool stringcompare(const char *lhs, const char *rhs) {
return std::strcmp(lhs, rhs) < 0;
}
std::binary_search(strings, strings+num_strings, "foe", stringcompare);
... oder std::set
verwenden. Aber solange Sie die Menge der Zeichenketten zur Laufzeit nicht ändern, hat die Verwendung einer Menge über ein sortiertes Array mit binärer Suche keinen Vorteil, und eine Menge (oder ein Vektor) muss mit Code gefüllt werden, während ein Array statisch initialisiert werden kann . Ich denke C++ 0x wird Dinge verbessern, mit Initialisierungslisten für Sammlungen.
+1 für die Nennung von sortierten 'Vektor 'mit' binary_search'. – avakar
Die technisch beste Lösung ist: Erstellen Sie eine 'perfekte Hash-Funktion', die auf Ihre Menge von String-Konstanten zugeschnitten ist, damit später beim Hashing keine Kollisionen auftreten.
Ich mag das Denken, aber das Problem ist - nicht nur konstant sollte nicht kollidieren, aber die mögliche Eingabe Zeichenfolge auch. –
- 1. Was ist der beste Weg, Programme in Windows zu vergleichen?
- 2. Was ist der beste Weg, um Flags Enum zu vergleichen?
- 3. Was ist der beste Weg zu
- 4. Was ist der beste Weg
- 5. Was ist der beste Weg, um eine Reihe von (~ 200) farbigen Rechtecken in Cocoa zu zeichnen?
- 6. Was ist der beste Weg, eine Sprache neu zu lernen?
- 7. Was ist der beste Weg, eine Schleifeninvariante zu bestimmen?
- 8. Was ist der beste Weg, eine Prozedur "verzögert" zu nennen?
- 9. Was ist der beste Weg, um mehrere Suchoptionen zu behandeln?
- 10. Was ist der beste Weg, um eine Enumeration zu erhöhen?
- 11. Was ist der beste Weg, eine Mercurial-Filiale zu schließen?
- 12. Was ist der beste Weg, um eine Tabelle zu deduplizieren?
- 13. Was ist der beste Weg, um eine IllegalArgumentException zu fangen
- 14. Was ist der beste Weg, um eine Animation zu fahren?
- 15. Was ist der beste Weg, um eine Eigenschaft zu deklarieren?
- 16. Was ist der beste Weg, um mit OSGI zu beginnen?
- 17. Was ist der beste Weg, Zeitzonen mit Javascript zu behandeln
- 18. Was ist der beste Weg, um eine Liste zu kopieren?
- 19. Was ist der beste Weg, um eine Sitemap zu erstellen?
- 20. Was ist der beste Weg, Ausnahmen mit ETW zu protokollieren?
- 21. Was ist der "beste" Weg, Skripte zu speichern?
- 22. Was ist der beste Weg, um eine Reihe von Rechtecken in einem Bild zusammenzuführen?
- 23. Eine IP-Adresse mit einer Tabelle von Subnetzmasken vergleichen ... Was ist der beste Ansatz in Java?
- 24. Was ist der beste Weg, Konfigurationsvariablen in PHP zu speichern?
- 25. Was ist der beste Weg, Plugins mit RSpec zu kompilieren?
- 26. Was ist der richtige Weg, um den Fall zu vergleichen?
- 27. Was ist der beste Weg, Alter mit Flex zu berechnen?
- 28. Was ist der beste Weg, um mit NHibernate zu beginnen?
- 29. Was ist der beste Weg, um eine Datenbank-Datensatz von einigen "unebenen" XML zu strukturieren
- 30. Was ist der beste Weg, Storyboard von einer App in eine andere zu kopieren?
Möchten Sie wirklich eine ** Konstante ** mit einer Reihe von ** Konstanten ** vergleichen? Das Ergebnis dieses Tests ist statisch bekannt, oder? –
Er könnte einen nicht konstanten Zeiger auf eine konstante Zeichenkette bedeuten: 'const char * blah =" foo "; if (isRiemannHypothesisTrue()) blah = "bar"; '. Dann überprüfe, ob Blah im Set ist. –
zu onebyone - ich denke, ich habe eine Frage gestellt, bevor ich denke =) Ich muss eine Zeichenfolge analysieren, wenn die Funktion also ein Schlüsselwort sieht, sollte es durch einen anderen Zeichenfolgenwert ersetzt werden. – mknight