2017-02-20 1 views
0

Für die Datenkomprimierung muss ich Dateien (hier Textdateien) öffnen und ihren gesamten Inhalt in Variablen speichern.String vs. Vektor zum Speichern großer Texte

Ist es besser, Strings oder Vektoren von Zeichen zu verwenden, um wirklich große Texte (Millionen oder mehr Zeichen) zu speichern?

Mit besser, ich meine schneller über jedes Zeichen zu durchlaufen, und auch schneller die count Funktion zu zählen, wie viele Vorkommen eines bestimmten Zeichens gibt es im Text sind.

Größe ist nicht wirklich ein Problem hier als Zeichenfolge und Vektor können viele Zeichen speichern, und ich kann, wenn nötig, brach den Text in ein paar Subtexte.

+2

Die tatsächliche Leistung hängt von der jeweiligen C++ - Implementierung ab. In dieser Hinsicht gibt es keinen wesentlichen Unterschied zwischen Strings und Vektoren. Beide sind Random-Access-Container, die vergleichbare Fähigkeiten bieten. Du wirst mehr Zeit damit verbringen, das herauszufinden, dann könntest du vielleicht hoffen, dass du sparst, indem du den angeblich optimalsten Container auswählst. –

+1

In der Praxis gibt es höchstwahrscheinlich keinen Unterschied. Beide Typen stellen Vorwärtsiteratoren bereit, die (normalerweise) als Zeiger implementiert sind. Der einzige semantische Unterschied besteht darin, dass Leser Ihres Codes wahrscheinlicher erwarten, dass "NUL" -Zeichen in die kontrollierte Sequenz für einen "Vektor" eingebettet sind. Da es sich jedoch um Textdateien handelt, ist das kein Problem. – IInspectable

+0

Ihr Engpass ist nicht der Container im Speicher, sondern Datei-I/O. Sie möchten einen Container verwenden, den Sie entweder * anpassen * oder die Kapazität während der Konstruktion festlegen können. Die Neuzuweisung von Speicher beim Lesen aus einer Datei ist sehr langsam. –

Antwort

3

da die Vektor- und String-Performance implementierungsabhängig ist, gibt es keine definitive Antwort. Ich schlage vor, dass Sie diese Aktionen in Ihrer Umgebung benchmarken und wählen.

this ist ein sehr schöner Vortrag über Benchmarking Ihres Codes und wie selbst der Standard nicht immer die richtigen Werkzeuge vorschlagen kann. Die Pointe des Vortrags ist, dass sich die Performance drastisch und unvorhersehbar ändern kann - in einem Beispiel wurde die Laufzeit in einer Schleife um 80% reduziert, indem die Compiler-Optimierung gestartet wurde.

Wenn Sie wirklich Wert auf Leistung legen, messen Sie sich immer selbst.

1

Ist es besser, Strings oder Vektoren von Zeichen zu verwenden, um wirklich große Texte (Millionen oder mehr Zeichen) zu speichern?

(hier Textdateien)

std::string ist für Textdaten geeignet ist. Meistens wegen der Konvention, und auch weil es einige rudimentäre Werkzeuge für die Verarbeitung von Zeichenketten zur Verfügung stellt, was std::vector nicht tut.

Durch besser, ich meine Schleife schneller über jedes Zeichen und schneller auch die Count-Funktion zu verwenden, zu zählen, wie viele Vorkommen eines gegebenen Zeichens es im Text.

Durch diese Metriken sowohl String und Vektor vergleichbar sind und praktisch die gleiche, auch wenn genaue Leistung Implementierung spezifisch ist.