C++17 中的 std::string_view 类
C++ 包含许多宝贵的功能来提高代码的性能,string_view 类就是其中之一。它被引入来创建对字符串的轻量级和非拥有引用。在本教程中,我们将讨论 string_view 类,并探索一些在 C++ 中使用 string_view 类而不是字符串类的示例。
什么是 string_view?
string_view 是 C++ 中的一个类,用于创建字符串的只读序列。它是一种非拥有字符串类型,这意味着它不管理与字符串及其引用关联的内存。它充当字符串的轻量级包装器,使我们能够高效地访问字符串,而无需创建多个副本。
基本上,当我们需要创建一个要读取的字符串时,我们可以使用 string_view 类来定义字符串,但我们不需要做任何修改。
让我们通过以下示例了解使用 string_view 类的要求。
示例 1(使用字符串类)
在下面的示例中,我们创建了 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}; // 在输出中显示字符串 cout << string1 << endl; cout << string2 << endl; cout << string3 << endl; return 0; }
输出
Welcome to the TutorialsPoint! Welcome to the TutorialsPoint! Welcome to the TutorialsPoint!
上述代码打印了 3 次不同的字符串。此外,我们不需要修改上述代码中的所有 3 个字符串,因为我们只读取它们。不过,我们创建了三个不同的字符串,它们占用了编译器内存。
因此,我们可以使用 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}; // 在输出中显示字符串 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 那样在内存中创建 3 个相同字符串的副本。因此,我们可以说 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_view 类。此外,我们无需付出太多努力即可在字符串和 string_view 之间进行转换
我们已经看到了在 C++ 代码中使用 string_view 类优于使用字符串类的好处。
结论
在本教程中,我们学习了如何在 C++ 中使用 string_view 类。当我们需要创建仅可读的字符串以避免无意的修改时,我们应该始终使用 string_view 类。此外,它有助于我们提高代码的性能,并且与字符串类一样易于使用。