Προβολή συμβολοσειρών σε C++

Probole Symboloseiron Se C



Στον τομέα του προγραμματισμού C++, η ιεράρχηση της αποτελεσματικότητας και της απόδοσης είναι ζωτικής σημασίας. Η κλάση 'std::string_view', που εισήχθη στην C++17, παρουσιάζει μια ευέλικτη και αποδοτική από άποψη μνήμης εναλλακτική λύση στον παραδοσιακό χειρισμό συμβολοσειρών. Στον πυρήνα του, το 'std::string_view' είναι μια αναφορά που δεν ανήκει σε μια ακολουθία χαρακτήρων, που συνήθως αντιπροσωπεύει μια υποσυμβολοσειρά μιας μεγαλύτερης συμβολοσειράς. Σε αντίθεση με το 'std::string' που κατέχει τα δεδομένα του και διαχειρίζεται τη μνήμη εσωτερικά, το 'std::string_view' λειτουργεί χωρίς να κατέχει τα υποκείμενα δεδομένα. Αυτό το χαρακτηριστικό το καθιστά ιδιαίτερα πολύτιμο για σενάρια όπου τα γενικά έξοδα αντιγραφής ή διαχείρισης της μνήμης είναι ανεπιθύμητα. Σε αυτό το άρθρο, θα διερευνήσουμε τα διαφορετικά παραδείγματα για να κατανοήσουμε τη χρήση του 'std::string_view' στη C++.

Παράδειγμα 1: Αποτελεσματικός χειρισμός χορδών

Στη σύγχρονη ανάπτυξη της C++, ο αποτελεσματικός χειρισμός συμβολοσειρών είναι ζωτικής σημασίας για τη βελτιστοποίηση της απόδοσης και της χρήσης πόρων. Επιτρέπει αποτελεσματική πρόσβαση και χειρισμό συμβολοσειρών χωρίς να χρειάζεται ανακατανομή ή αντιγραφή μνήμης. Για να επεξηγήσουμε αυτήν την έννοια, ας εμβαθύνουμε σε ένα πρακτικό παράδειγμα.







Εξετάστε το ακόλουθο απόσπασμα κώδικα:



#include
#include

void processStringView ( std::string_view strView ) {

std::cout << 'Μήκος:' << strView.length ( ) << std::endl;
std::cout << 'Περιεχόμενο:' << strView << std::endl;
}

int main ( ) {

std::string originalString = 'Αποτελεσματικός χειρισμός χορδών' ;

std::string_view viewOfString ( originalString ) ;

processStringView ( viewOfString ) ;

ΕΠΙΣΤΡΟΦΗ 0 ;
}


Σε αυτό το παράδειγμα, έχουμε τη συνάρτηση 'processStringView' που λαμβάνει ως παράμετρό της το 'std::string_view'. Στη συνέχεια, η συνάρτηση εκτυπώνει το μήκος και το περιεχόμενο της προβολής συμβολοσειράς χρησιμοποιώντας την τυπική έξοδο. Η κύρια συνάρτηση αρχικοποιεί το 'std::string' με το όνομα 'originalString' με την τιμή 'Efficient String Handling'. Στη συνέχεια, δημιουργείται το 'std::string_view' με το όνομα 'viewOfString', που αναφέρεται στο περιεχόμενο του 'originalString'.



Περνώντας το 'viewOfString' στη συνάρτηση 'processStringView', μπορούμε να εκτελέσουμε τις λειτουργίες στη συμβολοσειρά αποτελεσματικά, εξαλείφοντας την ανάγκη για επιπλέον εκχωρήσεις μνήμης. Το 'std::string_view' είναι μια ελαφριά αναφορά στην υποκείμενη ακολουθία χαρακτήρων του 'originalString' χωρίς αντιγραφή των δεδομένων.





Εδώ είναι το παραγόμενο αποτέλεσμα:



Παράδειγμα 2: Διαλειτουργικότητα με Κώδικα παλαιού τύπου

Στη σφαίρα της ανάπτυξης της C++, η απρόσκοπτη ενσωμάτωση νέων και παλαιών βάσεων κωδικών είναι συχνά μια κρίσιμη ανησυχία. Το 'std::string_view' επιτρέπει στους προγραμματιστές να αλληλεπιδρούν αβίαστα με λειτουργίες παλαιού τύπου που επιστρέφουν τους δείκτες 'const char'.

Εξετάστε το ακόλουθο παράδειγμα που δείχνει την πρακτική χρήση του 'std::string_view' για διαλειτουργικότητα. Εδώ, έχουμε μια συνάρτηση παλαιού τύπου με το όνομα 'legacyFunction()' που επιστρέφει έναν δείκτη 'const char':

#include
#include

const char * legacyFunction ( ) {
ΕΠΙΣΤΡΟΦΗ 'Χορδή κληρονομιάς' ;
}

int main ( ) {

std::string_view legacyStrView ( legacyFunction ( ) ) ;

std::cout << 'Προβολή συμβολοσειράς παλαιού τύπου:' << legacyStrView << std::endl;

ΕΠΙΣΤΡΟΦΗ 0 ;
}


Ξεκινάμε ορίζοντας μια συνάρτηση παλαιού τύπου με το όνομα “legacyFunction()” η οποία επιστρέφει έναν δείκτη “const char” που αντιπροσωπεύει μια συμβολοσειρά που έχει την ετικέτα “Legacy String”. Για να ενσωματώσουμε απρόσκοπτα αυτά τα δεδομένα παλαιού τύπου στο σύγχρονο πρόγραμμά μας C++, χρησιμοποιούμε το 'std::string_view'. Στη συνάρτηση main(), συγκεκριμένα, δημιουργούμε ένα στιγμιότυπο του “std::string_view” με το όνομα “legacyStrView” και το αρχικοποιούμε με το αποτέλεσμα της συνάρτησης παλαιού τύπου. Αυτό το instantiation μας επιτρέπει να ενσωματώσουμε αποτελεσματικά και να εργαστούμε με τον παλαιωμένο δείκτη 'const char'.

Ως αποτέλεσμα, μπορούμε να έχουμε πρόσβαση και να χειριστούμε τη συμβολοσειρά παλαιού τύπου χωρίς να καταφεύγουμε σε περιττή αντιγραφή δεδομένων, διατηρώντας τόσο την αποτελεσματικότητα όσο και τη συμβατότητα. Το τελευταίο βήμα στον κώδικα περιλαμβάνει τη χρήση του 'std::cout' για την εκτύπωση του περιεχομένου της προβολής συμβολοσειράς παλαιού τύπου.

Η έξοδος που εκτελείται είναι:

Παράδειγμα 3: Βελτιωμένος χειρισμός συμβολοσειρών

Οι κυριολεκτικές συμβολοσειρές στη C++ αντιπροσωπεύονται παραδοσιακά ως πίνακες χαρακτήρων. Το 'std::string_view' απλοποιεί την εργασία με τα κυριολεκτικά συμβολοσειράς παρέχοντας μια βολική διεπαφή. Επιτρέποντας μια άμεση πρόσβαση στον υποκείμενο πίνακα χαρακτήρων χωρίς την ανάγκη ρητών μετατροπών, το 'std::string_view' βελτιστοποιεί τις λειτουργίες στα γράμματα συμβολοσειρών.

#include
#include

int main ( ) {
const char * myLiteral = 'Γεια σου, String View!' ;
std::string_view literalView ( myLiteral ) ;

std::cout << 'Πρώτος χαρακτήρας:' << LiteralView [ 0 ] << std::endl;

size_t θέση = literalView.find ( 'Σειρά' ) ;
std::cout << 'Θέση υποσυμβολοσειράς: ' << θέση << std::endl;

ΕΠΙΣΤΡΟΦΗ 0 ;
}


Σε αυτό το παράδειγμα, ένα 'Hello, String View!' Το string literal εκχωρείται στον δείκτη 'myLiteral'. Η εισαγωγή του 'std::string_view' διευκολύνει μια πιο αποτελεσματική αναπαράσταση αυτής της συμβολοσειράς χωρίς την ανάγκη αντιγραφής του περιεχομένου της. Το αντικείμενο 'literalView' δημιουργείται χρησιμοποιώντας τον δείκτη 'myLiteral' που μας επιτρέπει να προβάλουμε και να χειριστούμε την υποκείμενη ακολουθία χαρακτήρων.

Η χρήση του 'std::string_view' παρέχει εύκολη πρόσβαση σε μεμονωμένους χαρακτήρες μέσα στη συμβολοσειρά. Στο απόσπασμα κώδικα, το 'literalView[0]' ανακτά και εκτυπώνει τον πρώτο χαρακτήρα της συμβολοσειράς, επιδεικνύοντας την απλότητα και την αμεσότητα της πρόσβασης στα στοιχεία. Η μέθοδος 'εύρεσης' του 'std::string_view' χρησιμοποιείται για τον προσδιορισμό της θέσης της υποσυμβολοσειράς 'String' εντός της αρχικής συμβολοσειράς.

Παράδειγμα 4: Εξαγωγή υποσυμβολοσειράς

Η εργασία της εξαγωγής υποσυμβολοσειράς περιλαμβάνει την ανάκτηση ενός τμήματος μιας δεδομένης συμβολοσειράς με βάση καθορισμένα κριτήρια όπως η θέση ενός οριοθέτη. Η δυνατότητα εξαγωγής χωρίς κόπο των υποσυμβολοσειρών είναι ένα ισχυρό χαρακτηριστικό του 'std::string_view'. Εξετάστε ένα σενάριο όπου πρέπει να εξαγάγουμε ένα τμήμα μιας συμβολοσειράς με βάση έναν οριοθέτη:

#include
#include

int main ( ) {
std::string fullString = 'μήλο-πορτοκάλι-μπανάνα' ;
size_t delimiterPos = fullString.find ( '-' ) ;

std::string_view subString = fullString.substr ( 0 , οριοθέτηςΠοσ ) ;

std::cout << 'Extracted Substring: ' << υποσυμβολοσειρά << std::endl;

ΕΠΙΣΤΡΟΦΗ 0 ;
}


Σε αυτό το απόσπασμα κώδικα, ξεκινάμε με τη δήλωση μιας αρχικής συμβολοσειράς, 'fullString', η οποία αρχικοποιείται με την τιμή 'apple-orange-banana'. Στόχος μας είναι να εκτελέσουμε την εξαγωγή υποσυμβολοσειράς. Για να το πετύχουμε αυτό, χρησιμοποιούμε τη συνάρτηση «εύρεσης» που παρέχεται από την τυπική βιβλιοθήκη της C++.

Μόλις προσδιορίσουμε τη θέση του οριοθέτη μέσα στο 'fullString', που είναι αποθηκευμένο στη μεταβλητή 'delimiterPos', εξάγουμε την επιθυμητή υποσυμβολοσειρά. Η συνάρτηση «substr» καλείται στην αρχική συμβολοσειρά, προσδιορίζοντας την αρχική θέση (0) και το μήκος της υποσυμβολοσειράς που είναι ακριβώς η θέση του οριοθέτη. Αυτή η λειτουργία οδηγεί στη δημιουργία του 'std::string_view' με το όνομα 'subString' που αντιπροσωπεύει το τμήμα της αρχικής συμβολοσειράς από την αρχή μέχρι τον οριοθέτη.

Παράδειγμα 5: Δομές δεδομένων αποδοτικών στη μνήμη

Το 'std::string_view' διαδραματίζει κρίσιμο ρόλο στο σχεδιασμό των δομών δεδομένων αποδοτικών στη μνήμη. Αντί να αποθηκεύουν πολλαπλά αντίγραφα συμβολοσειρών, οι δομές δεδομένων μπορούν να αποθηκεύουν τα στιγμιότυπα «std::string_view», μειώνοντας έτσι την επιβάρυνση της μνήμης.

#include
#include

struct Εγγραφή {
std::string_view όνομα;
int ηλικία?
} ;

int main ( ) {

Ρεκόρ πρόσωπο = { 'John Doe' , 30 } ;

std::cout << 'Ονομα: ' << πρόσωπο.όνομα << ', Ηλικία: ' << προσωπικότητα << std::endl;

ΕΠΙΣΤΡΟΦΗ 0 ;
}


Σε αυτό το απόσπασμα κώδικα, παρουσιάζουμε τη χρήση του 'std::string_view' σε μια δομή δεδομένων αποδοτικής μνήμης. Ορίζουμε μια δομή 'Record' που περιλαμβάνει ένα μέλος 'std::string_view' με το όνομα 'name' και ένα ακέραιο μέλος που ονομάζεται 'age'. Η χρήση του 'std::string_view' σε αυτό το πλαίσιο μας επιτρέπει να δημιουργήσουμε μια ελαφριά αναπαράσταση μιας συμβολοσειράς χωρίς την ανάγκη για πρόσθετη εκχώρηση μνήμης.

Στη συνάρτηση 'main', εγκαινιάζουμε ένα αντικείμενο 'Record' με το όνομα 'person' με το όνομα 'John Doe' και την ηλικία των 30. Το μέλος 'std::string_view' 'name' χρησιμεύει ως προβολή που δεν ανήκει στο τα δεδομένα χαρακτήρων που αντιστοιχούν στο όνομα, εξαλείφοντας την ανάγκη αντιγραφής του περιεχομένου συμβολοσειράς. Το 'std::cout << 'Όνομα: ' << άτομο.όνομα << ', Ηλικία: ' << άτομο.ηλικία << std::endl;' Η δήλωση εξάγει το όνομα και την ηλικία του ατόμου που είναι αποθηκευμένα στο αντικείμενο 'Record'.

συμπέρασμα

Στο συνεχώς εξελισσόμενο τοπίο της ανάπτυξης της C++, το 'std::string_view' ξεχωρίζει ως πολύτιμη προσθήκη στην εργαλειοθήκη του προγραμματιστή. Οι περιπτώσεις που παρουσιάζονται σε αυτό το άρθρο υπογραμμίζουν την προσαρμοστικότητα και τη χρησιμότητα του 'std::string_view' στο πεδίο του προγραμματισμού C++. Από τον αποτελεσματικό χειρισμό συμβολοσειρών και την απρόσκοπτη διαλειτουργικότητα με κώδικα παλαιού τύπου έως δομές δεδομένων αποδοτικών στη μνήμη, το 'std::string_view' είναι πολύτιμο για προγραμματιστές που αναζητούν βελτιωμένη απόδοση και βελτιστοποιημένο κώδικα σε διάφορα σενάρια. Αυτά τα σενάρια πραγματικού κόσμου δείχνουν πώς το 'std::string_view' μπορεί να βελτιστοποιήσει τον κώδικα, να μειώσει την περιττή επιβάρυνση της μνήμης και να συμβάλει στη συνολική αποτελεσματικότητα των εφαρμογών C++.