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

更新于:2023年8月18日

浏览量:150

启动你的职业生涯

通过完成课程获得认证

开始学习
广告