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类一样易于使用。