zeichenfolge schnellstmöglichst vergleichen
-
@eventuell wenn ich mich richtig erinnert haben sollte, ist doch sdt::map ne relativ langsame funktion?
@MBCS-CITP die länge der dateiendungen ist ja leider nicht festgesetzt es gäbe ja z.b. php und die endung php3.
-
das ist überhaupt keine funktion. zeigt schon das du keine ahnung hast.
-
Generell würde ich sagen ist es kein richtiger
Anwendungsfall dafür das die strings möglichst schnell
verglichen werden müssen, wenn dies nur beim Starten
der Anwendung geschieht.
In einem solchen Fall ist eine richtige Optimierung
denke ich eher zuviel Arbeitsaufwand für nix was der User
wirklich merkt.Man könnte das so machen.
std::vector<string> prefixValues; prefixValues.push_back ("php3"); prefixValues.push_back ("php4"); typedef vector<string>::iterator iter; for (iter = prefixValues.begin(); iter != prefixValues.end(); ++iter) { if (testString.compare((*iter)) == 0) { cout << "String ist in Liste ;-)" << endl; } }Die compare methode aus std::string ist eine bereits
optimierte Vergleichmethode.
-
@eventuell und was hat das mit meinem problem zu tun?
Und was ist daran so schlimm das ich keien ahnung hab?
Wenn ich ahnung von c++ hätte bräuchte ich hier nicht fragen, sondern wüsste die Antworten selbst und ausserdem programmiere ich erst seit nen drei-viertel Jahr, in meiner Freizeit mal so ein zwei stunden am Tag.Und ausserdem ist das hier unwichtig ich weiss nur das ich mal gelesen hab um in einer "tabelle" daten vorzuhalten da hatte man verglichen char array, vector map usw. un da hieß es das map ungeeignet ist wenn es um geschwindigkeit geht
-
@viper190 Da besteht wohl ein Missverständis also schonmal Endschuldigung wenn ich mich undeutlich ausgedrückt habe:
Verglichen wird während das Programm (ein webserver) läuft.
Immer wenn eine Anfrage gestellt wird soll nachgesehen werden ob diese Endung im Server als eine cgi Erweiterung geführt wird.
Wenn ja soll die entsprechende Exe gestartet werden(z.b.php-cgi.exe)
und die verabreiteten daten zum Clienten geschickt werden.Oben wollte ich nur sagen das es auch möglich wäre, wenn hilfreich die Daten schon beim start des Servers vorzusortieren, wenn dies die anschließende Funktion die eben im Server laufend aufgerufen wird dadurch Beschleunigt werden kann.
Hoffe mal das war jetzt ein wenig Verständlicher von mir.
-
std::map
-
Skippy schrieb:
Und ausserdem ist das hier unwichtig ich weiss nur das ich mal gelesen hab um in einer "tabelle" daten vorzuhalten da hatte man verglichen char array, vector map usw. un da hieß es das map ungeeignet ist wenn es um geschwindigkeit geht
Kann mir nicht vorstellen das map ungeeignet ist einen eintrag zu finden da diese Struktur schon mal nach keys sortiert ist. Würde eher behaupten map ist aufs finden spezialisiert. "Langsam" is wahrscheinlich einfügen und löschen.
Kurt
-
Ich habs dreimal durchgelesen, und nicht verstanden:
Hast DU Deinen Text auf japanisch geschrieben, und diesen dann übersetzen lassen?
Wie wäre es denn, Du würdest - Artchi sagte es schon - erst einmal Deutsch lernen.Ich schreib ja auch oft sehr hektisch; aber der "vorschau"-Button wäre sehr hilfreich. ( Dies war ein Konjunktiv)
-
@HannsW es gibt ne viel einfachere Erklärung screenreader und spracherkennung
So und nun Versuch Nummer zwei,
1.Beim Start des Programms bekommt ihr folgende Zeichenfolge: php,php3,phtml
damit könnt ihr machen was ihr wollt selbst der typ steht vollkommen frei es kann von mir aus als char string map oder sonstwas vorliegen oder umgewandelt werden.
Einzige Bedingung der String selbst muss beliebig Erweiterbar sein bis 255 Zeichen
also die Anzahl der angegeben Endungen steht nicht fest.!!!Und danach will ich in einer Funktion einfach nur Prüfen ob die Dateiendung vorhanden ist Die ich als Anfrage bekommen habe(z.b.index.php)und wenn die Dateiendung
hier "php" vorhanden ist soll ne andere Funktion aufgerufen werden die der php-cgi.exe sagt das sie index.php verarbeiten soll usw.Und diese Erkennung ob die Endung php vorhanden ist soll so schnell wie möglich erfolgen.
-
und warum geht nicht str.find()?
etwastd::str dasWasÜbergeben wurde; if (dasWasÜbergeben.find ("PHP4,0)> 0 ) { tue dies;returun;} //... if (dasWasÜbergeben.find ("PHP",0)> 0 ) { tue jenes;return;}AUf PHP darfst Du dann naturlich errst als letztes prüfen
-
@HannsW
Problem das die Anzahl der Endungen und die Endungen selbst nicht feststehenund es gibt dort ein problem (sicherheitslücke) da php45 als php4 erkannt werden würde
momentan hab ich das ja folgendermaßen gemacht
char * token; token = strtok(CGIEXTENSION, ","); if(ufileext == token)CGItoEXECUTE=1; while(CGItoEXECUTE == 0 && token != NULL ) { token = strtok(NULL, ","); if(token == NULL) break; if(ufileext == token)CGItoEXECUTE=1; }
-

-
Früher gab es mal argc und argv!
Außerdem musst Du doch wissen, worauf Du prüfen willst. "php4" und "php45". z.Bint main(int argc, char *argv[]){ for ( int i = 1 ; i< argc ; i++) { if ( argv[i] = "php4") { // solltest aber z.b mit UPPERCASE vergleichen // falls einer "PhP4" schreibt machewas; continue; // leiben manche nicht } if ...... unn soweiter } }
-
@HannsW: argc und argv gibt es immer noch. Und wenn ich Skippy richtig verstehe, kann der Nutzer neue Fileextensions in seinem Programm registrieren. (Ähnlich dem Registrieren von Dateiendungen in Windows)
@Skippy: Dein Code funktioniert so nicht. Du vergleichst Pointer statt Strings. Wenn Du mit char* arbeitest, musst Du strcmp (oder ähnliche Routinen verwenden).
Wenn Du davon ausgehst, dass Du nur wenige Extensions hast, dann ist ein map unsinnig. In Deinem Beispiel nützt Dir die map wenig, da kannst Du auch linear durch einen Vektor suchen.
Wenn Du dagegen erwartest, dass sehr viele Extensions registriert sind, dann macht eine map Sinn und ist mit Sicherheit eine schnelle Lösung.
Beispiel (inkl. Tippfehler und so):
class CGI { public: void registerExtension( const std::string& ext, const std::string exeFileName); const std::string& findExe( const std::string& ext) const; private: std::map<std::string, std::string> _cgiExt; }; void CGI::registerExtension( const std::string& ext, const std::string exeFileName) { // check vorher, um zu verhindern, dass versehentlich eine extension // zweimal registriert wird. _cgiExt.insert( std::make_pair( ext, exeFileName); } const std::string& CGI::findExe( const std::string& ext) const { std::map<std::string, std::string>::const_iterator it = _cgiExt.find( ext); if( it == _cgiExt.end()) { return std::string(); // nicht gefunden, Leerstring oder Exception? } return it->second; }