C++17 std::string_view类
C++中包含许多宝贵的功能来提高代码的性能,其中string_view类就是其中之一。它被引入以创建一个轻量级的、非拥有的对字符串的引用。在本教程中,我们将讨论string_view类,并使用它在C++中的字符串类上探讨几个示例。
什么是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};
// 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!
以上代码打印出不同的字符串3次。而且,我们不需要修改上述代码中的所有3个字符串,因为我们只读取它们。但是,我们创建了三个不同的字符串,这会占用编译器的内存。
所以,我们可以使用string_view类,这样它不会为特定字符串的引用分配内存。
示例2(使用string_view类)
在这个例子中,我们创建了string1,并将其引用给了string2和string3。同时,我们使用了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那样在内存中创建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类一样轻松地使用string_view类。此外,我们可以在不费太多精力的情况下在字符串和string_view之间进行转换。
我们已经看到了在C++代码中使用string_view类相比于string类的好处。
结论
在本教程中,我们学习了如何在C++中使用string_view类。我们应该始终在需要创建只读字符串以避免无意修改时使用string_view类。此外,它帮助我们提高代码的性能,并且和string类一样易于使用。