Wie würde ich einen vector<char> nach Schlüsselwörtern durchsuchen?
-
Eben das ist das Problem:
von char[] nach vector<char> dann nach std::string. Wobei auch \0 zwischendrin vorkommen kann. Und verdammt schnell soll's auch sein.Ausser einem bißchen unterirdischen C in einem C++ Programm fällt mir auf Anhieb nix ein.
-
#include <vector> #include <algorithm> #include <iostream> using namespace std; int main() { char text[] = "Hallo foo Welt"; vector<char> content(text, text + sizeof(text)); char query[] = "foo"; auto found = search(begin(content), end(content), begin(query), end(query) - 1); // -1 wegen der Nullterminierung cout << found - begin(content) << endl; }
-
Was ist auto? Gibt's in VS 2005 wohl nicht. Ist aber cool. Danke.
-
Wieso kannst du keinen std::string verwenden?
-
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 danncontent.begin()für den Vektor machen und beim Array das Ganze durch Zeigergeschubse lösen, sprichqueryundquery + 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 NullterminierungOhne -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
stringdenn schneller alsvector<char>und was hat das mit Binärdaten zu tun?stringkann sehr wohl'\0'enthalten. C++ ist nicht C.
vectorist aber genau richtig hier, weil die Extras vonstringnicht 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
stringdenn schneller alsvector<char>und was hat das mit Binärdaten zu tun?stringkann sehr wohl'\0'enthalten. C++ ist nicht C.
vectorist aber genau richtig hier, weil die Extras vonstringnicht 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 NullterminierungOhne -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.