2016-09-01 2 views
-1

Gibt es eine effizientere Art und Weise in C++ die Anzahl der Zeichen in einem string die ASCII Wert ihres ganzen Zahl ist, andere oberhalb einer bestimmten Grenz zu zählen als in einer Schleife eines char zu einer Zeit Auswertung über die gesamte string?zählt, wie viele Zeichen oberhalb einer ganzen Zahl Cutoff

+0

Sie meinen, andere als 'std :: countIf()' – drescherjm

+2

Nun, wenn Sie eine Zeichenfolge haben, und Sie haben Um zu bestimmen, ob jedes Zeichen in der Kette eine bestimmte Anforderung erfüllt oder nicht erfüllt, müssen Sie herausfinden, wie Sie einige fundamentale Gesetze der Physik des Universums, in dem wir leben, brechen können, ohne tatsächlich alle betrachten zu müssen Zeichen in der Zeichenfolge. –

Antwort

1

Sie könnten parallelisieren (threads) oder vektorisieren (SSE-Vektor-Anweisungen) ich denke, obwohl mit Optimierungen ausgereizt werden einige Compiler eine einfache Prüfschleife wie diese für Sie vektorisieren, so dass explizite Vektorisierung nicht benötigt würde.

Die Ersparnisse sind jedoch wahrscheinlich winzig; Für eine Aufgabe, die so einfach ist, ist die Zeichenfolge entweder so klein, dass Optimierungen nicht hilfreich sind, oder Sie sind wahrscheinlich an die Speicherbandbreite gebunden. die CPU kann durch eine Schnur wie diese ziemlich verdammt schnell fließen.

Das heißt, es gibt keinen wirklichen Grund zu stören. std::countif wird für einfachen Code zu machen, so, wenn Sie (durch Profilierung) bewiesen haben, dass der Code zu langsam ist, es einfach zu verwenden:

int num_above_a = std::count_if(v.begin(), v.end(), [](unsigned char c){return c > 'a';}) 
3

Wie drescherjm sagte, was Sie wollen, ist std::count_if. Zum Beispiel finden Sie alle Zeichen, die einen ASCII-Wert größer als die von ‚3‘:

std::string s = "12345"; 
const char value = '3'; 
int count = std::count_if(s.begin(), s.end(), 
    [](const char& a) { return a > value; }); 
Verwandte Themen