string_view
war eine vorgeschlagene Funktion innerhalb der C++ Library Fundamentals TS ( N3921 ), die zu C++ 17 hinzugefügt wurde
Soweit ich verstehe, handelt es sich um einen Typ, der eine Art Zeichenfolge "Konzept" darstellt, dh eine Ansicht eines beliebigen Containertyps, in dem etwas gespeichert werden kann, das als Zeichenfolge angezeigt werden kann.
const std::string&
Parametertyp wird string_view
?string_view
in Erwägung ziehen ?Der Zweck aller Arten von "String-Referenz" - und "Array-Referenz" -Vorschlägen besteht darin, das Kopieren von Daten zu vermeiden, die sich bereits in einem anderen Besitz befinden und für die nur eine nicht mutierende Ansicht erforderlich ist. Das string_view
in Frage kommt ein solcher Vorschlag; es gab frühere mit dem Namen string_ref
und array_ref
, auch.
Die Idee ist immer, ein Paar Zeiger auf das erste Element und die Größe eines vorhandenen Datenarrays oder einer Zeichenfolge zu speichern.
Eine solche View-Handle-Klasse kann kostengünstig nach Wert weitergegeben werden und bietet kostengünstige Teilzeichenfolgenoperationen (die als einfache Zeigerinkremente und Größenanpassungen implementiert werden können).
Bei vielen Verwendungen von Zeichenfolgen ist es nicht erforderlich, die Zeichenfolgen tatsächlich zu besitzen, und die betreffende Zeichenfolge ist häufig bereits im Besitz einer anderen Person. Es besteht also ein echtes Potenzial zur Steigerung der Effizienz, indem nicht benötigte Kopien vermieden werden (denken Sie an alle Zuordnungen und Ausnahmen, die Sie speichern können).
Die ursprünglichen C-Zeichenfolgen hatten das Problem, dass der Nullterminator Teil der Zeichenfolgen-APIs war. Daher konnten Sie Teilzeichenfolgen nicht einfach erstellen, ohne die zugrunde liegende Zeichenfolge (a la strtok
) zu ändern. In C++ lässt sich dies leicht lösen, indem die Länge separat gespeichert und der Zeiger und die Größe in eine Klasse eingeschlossen werden.
Das größte Hindernis und die größte Abweichung von der Philosophie der C++ - Standardbibliothek ist, dass solche Klassen mit "referentieller Sicht" eine völlig andere Besitzersemantik haben als der Rest der Standardbibliothek. Grundsätzlich ist alles andere in der Standardbibliothek unbedingt sicher und korrekt (wenn es kompiliert wird, ist es korrekt). Bei solchen Referenzklassen ist das nicht mehr der Fall. Die Richtigkeit Ihres Programms hängt vom Umgebungscode ab, der diese Klassen verwendet. Das ist schwieriger zu überprüfen und zu lehren.