Wie würde ich einen vector<char> nach Schlüsselwörtern durchsuchen?



  • auto ist C++11. Du kannst stattdessen auch den konkreten Typen, in diesem Fall vector<char>::iterator , angeben.

    Wenn du einen älteren Compiler benutzt, wird dir auch begin(content) um die Ohren fliegen. Daraus musst du dann content.begin() für den Vektor machen und beim Array das Ganze durch Zeigergeschubse lösen, sprich query und query + sizeof(query) - 1 .

    char text[] = "Hallo foo Welt";
    	vector<char> content(text, text + sizeof(text));
    
    	char query[] = "foo";
    	auto found = search(content.begin(), content.end(), query, query + sizeof(query) - 1);	// -1 wegen der Nullterminierung
    	cout << found - begin(content) << endl;
    

    Welche Typen haben denn deine Ursprungsdaten?



  • dot schrieb:

    Wieso kannst du keinen std::string verwenden?

    Weil es evtl. auch Binärdaten sind, die aus dem www heruntergeladen und nach Schlüsselwörten durchsucht werden müssen. Und zwar so schnell wie möglich das Ganze.

    Ich hab's ja mit unterirdischem C gelöst, es wäre aber interessant andere überzeugende Lösungsansätze zu sehen.

    Geliefert:
    ein char pointer (+ Länge) von recv (Winsock)
    Gefragt:
    s.o.



  • Danke Michael E.,
    ich denke mein unterirdisches C war bisher die beste wenn auch nicht unbedingt die eleganteste Lösung: memcpy den ganzen Schei** und gut is.



  • Michael E. schrieb:

    auto found = search(begin(content), end(content), begin(query), end(query) - 1);	// -1 wegen der Nullterminierung
    

    Ohne -1 stimmts schon.



  • EOP schrieb:

    dot schrieb:

    Wieso kannst du keinen std::string verwenden?

    Weil es evtl. auch Binärdaten sind, die aus dem www heruntergeladen und nach Schlüsselwörten durchsucht werden müssen. Und zwar so schnell wie möglich das Ganze.

    Ok, das macht Sinn 🙂



  • dot schrieb:

    EOP schrieb:

    dot schrieb:

    Wieso kannst du keinen std::string verwenden?

    Weil es evtl. auch Binärdaten sind, die aus dem www heruntergeladen und nach Schlüsselwörten durchsucht werden müssen. Und zwar so schnell wie möglich das Ganze.

    Ok, das macht Sinn 🙂

    Für mich nicht. Warum ist string denn schneller als vector<char> und was hat das mit Binärdaten zu tun? string kann sehr wohl '\0' enthalten. C++ ist nicht C.
    vector ist aber genau richtig hier, weil die Extras von string nicht benötigt werden.



  • Nach einem kurzen Test hab ich festgestellt, daß std::string das '\0' anscheinend einfach entfernt (VS 2005).
    Das kann's ja auch nicht sein. Ich will alles.

    Aber ausser von ME hab ich noch keine vernünftige Anrwort (C++<11) bekommen.



  • TyRoXx schrieb:

    dot schrieb:

    EOP schrieb:

    dot schrieb:

    Wieso kannst du keinen std::string verwenden?

    Weil es evtl. auch Binärdaten sind, die aus dem www heruntergeladen und nach Schlüsselwörten durchsucht werden müssen. Und zwar so schnell wie möglich das Ganze.

    Ok, das macht Sinn 🙂

    Für mich nicht. Warum ist string denn schneller als vector<char> und was hat das mit Binärdaten zu tun? string kann sehr wohl '\0' enthalten. C++ ist nicht C.
    vector ist aber genau richtig hier, weil die Extras von string nicht benötigt werden.

    Wenn du mich fragst wäre string hier nicht angebracht, weil man es schon rein semantisch nicht mit strings zu tun hat...



  • Muss ich morgen/heute erst testen, ob sowas wie string.append( "a\0b" ) funktioniert, und wenn dann wie.



  • EOP schrieb:

    Muss ich morgen/heute erst testen, ob sowas wie string.append( "a\0b" ) funktioniert, und wenn dann wie.

    ja, es funktioniert.
    string speichert dir alle zeichen, die du möchtest.
    wie hast du denn herausgefunden, dass die '\0' offenbar verschluckt wird?
    ausgegeben? falls ja: länge mit angeben
    z.Bsp.:
    std::cout.write(the_string, the_string.size());

    bb



  • Strings können zwar '\0' enthalten, aber bei

    string.append( "a\0b" )
    

    wird das übergebene String-Literal als null-terminiert aufgefaßt (denn sonst könnte es ja das Ende des Literals nicht erkennen), d.h. es würde nur "a" hinzugefügt. Abhilfe würde hier nur

    string.append( "a\0b", 3 )
    

    schaffen, um auch die beiden anderen Zeichen hinzuzufügen.

    Trotzdem würde ich hier auch zu vector<char> raten. Und Michael E. hat dir doch für C++0x03 (d.h. u.a. für VS 2005) kompatiblem Code geliefert (beachte nicht die Anmerkung von PI, der kann nämlich nicht rechnen ;-).



  • 314159265358979__ schrieb:

    Michael E. schrieb:

    auto found = search(begin(content), end(content), begin(query), end(query) - 1);	// -1 wegen der Nullterminierung
    

    Ohne -1 stimmts schon.

    Nein. Die -1 ist richtig. Warum er -1 geschrieben hat, steht doch sogar erklärt da!



  • Nicht gleich so aggressiv. Ich hatte nen Denkfehler, piss dich nicht gleich so an.



  • 314159265358979 schrieb:

    Nicht gleich so aggressiv.

    Ich zitiere Dich bei Gelegenheit. :p



  • Ich bin ein Teenie, ich darf das.


Anmelden zum Antworten