C++17 中的 std::string_view 類
C++包含許多寶貴的特性來增強程式碼的效能,而string_view類就是其中之一。它被引入用於建立對字串的輕量級且非擁有性的引用。在本教程中,我們將討論string_view類,並探討一些使用C++中string_view類代替string類的示例。
什麼是string_view?
string_view是C++中用於建立字串只讀序列的類。它是一種非擁有型字串型別,這意味著它不管理與字串及其引用相關的記憶體。它充當字串的輕量級包裝器,允許我們高效地訪問字串而無需建立多個副本。
基本上,當我們需要建立一個只讀字串時,可以使用string_view類,而不需要進行任何修改。
讓我們透過下面的示例來了解使用string_view類的要求。
示例1(使用string類)
在下面的示例中,我們建立了string1、string2和string3。此外,我們用string1初始化了string2和string3。在輸出中,我們可以觀察到string1、string2和string3的值。
#include <iostream> #include <string> using namespace std; int main() { char string1[]{"Welcome to the TutorialsPoint!"}; string string2{string1}; string string3{string1}; // Show the strings in the output cout << string1 << endl; cout << string2 << endl; cout << string3 << endl; return 0; }
輸出
Welcome to the TutorialsPoint! Welcome to the TutorialsPoint! Welcome to the TutorialsPoint!
以上程式碼列印了三次不同的字串。而且,我們不需要修改以上程式碼中的所有三個字串,因為我們只是讀取它們。儘管如此,我們仍然建立了三個不同的字串,這會佔用編譯器的記憶體。
因此,我們可以使用string_view類,這樣它就不會為特定字串的引用分配記憶體。
示例2(使用string_view類)
在這個示例中,我們建立了string1,並將它的引用賦給了string2和string1。此外,我們使用string_view類來建立一個字串。接下來,我們在輸出中列印所有三個字串。
#include <iostream> #include <string_view> using namespace std; int main() { string_view string1{"Welcome to the TutorialsPoint!"}; string_view string2{string1}; string_view string3{string1}; // Show the strings in the output cout << string1 << endl; cout << string2 << endl; cout << string3 << endl; return 0; }
輸出
Welcome to the TutorialsPoint! Welcome to the TutorialsPoint! Welcome to the TutorialsPoint!
示例2的輸出與示例1相同,但示例2不像示例1那樣在記憶體中建立三個相同字串的副本。因此,可以說string_view類提高了程式碼的效能,因為它佔用更少的記憶體。
示例3
在下面的示例中,我們檢查兩個字串是否相等。我們使用string_view類來定義字串,因為我們需要讀取字串來匹配兩個字串。
areStringsEqual()函式根據字串是否相等返回布林值。
#include <iostream> #include <string_view> using namespace std; bool areStringsEqual(string_view string1, string_view string2) { return string1 == string2; } int main() { string_view string1("Tutorials"); string_view string2("Point"); if (areStringsEqual(string1, string2)) cout << "Strings are equal." << std::endl; else cout << "Strings are not equal." << std::endl; return 0; }
輸出
Strings are not equal.
示例4
在下面的示例中,我們查詢給定字串的子字串。我們使用string_view類定義字串,因為我們需要讀取字串來獲取子字串,但不需要修改字串。
在printSubstring()方法中,我們使用substr()方法從給定的位置獲取子字串並列印它們。
#include <iostream> #include <string_view> using namespace std; void printSubstring(string_view str, int startPos, int length) { string_view substring = str.substr(startPos, length); cout << "Substring is : " << substring << endl; } int main() { string_view sentence("Hey! Hi How are you doing these days?"); printSubstring(sentence, 4, 5); printSubstring(sentence, 16, 5); printSubstring(sentence, 36, 3); return 0; }
輸出
Substring is : Hi H Substring is : you d Substring is : ?
使用string_view的優點是什麼?
這裡我們列出了一些使用string_view類的優點。
高效的字串處理 - string_view不會複製字串資料。它允許開發者傳遞和儲存對字串的引用,而無需記憶體分配和釋放的開銷。它節省了記憶體。
不可修改 - 當我們只需要建立只讀字串並確保它們不會被意外修改時,可以使用string_view類。通常,當我們需要定義字串並將其作為函式引數傳遞在函式內部使用時,可以使用它。
相容性 - 我們可以像使用string類一樣輕鬆地在程式碼中使用string_view類。此外,我們可以在string和string_view之間進行轉換,而無需付出太多努力。
我們已經看到了在C++程式碼中使用string_view類優於string類的優點。
結論
在本教程中,我們學習瞭如何在C++中使用string_view類。當我們只需要建立只讀字串以避免意外修改時,應該始終使用string_view類。此外,它有助於我們提高程式碼的效能,並且像string類一樣易於使用。