是否有用于子字符串的标准库 class?

Is there a standard library class for substrings?

我有一个很大的只读字符串,我扫描了它的语法,并基于这个简单的语法提取了一堆较小的字符串,稍后我将使用这些字符串进行进一步处理。根据测试,将大部分大字符串创建并复制到小字符串中是一种性能瓶颈(每个大字符串有数千个)。

我认为我实际上并不需要为 - 分配数据,也不需要复制数据。我真正需要的是一种字符串片段类型,它只会存储指向相关数据开头和长度的指针,但与此同时,它应该是 std::string 和所有的替代品它具有的标准库交互。

无论如何,这将是最容易实现的,我可以为此推出自己的 class 并实现我需要的功能,但如果标准库中已经有类似的东西,那为什么还要麻烦。

那么基本上,STL 中是否有 class 类型的子字符串?

是的,从 C++17 开始你有 std::string_view.

示例:

#include <iostream>
#include <string>
#include <string_view>

int main() {
    std::string foo = "Hello world";

    std::string_view a(foo.c_str(), 5);
    std::string_view b(foo.c_str() + 6, 5);

    std::cout << a << '\n'   // prints Hello
              << b << '\n';  // prints world
}

这里使用 std::string_view 而不是 std::string 非常有利于减少那些原始字符串的副本并能够使用 std::string_view::substr.

字符串视图不是复制您正在操作的字符串,而是为基础字符串提供 视图 - 几乎只是指向字符串开头和大小的指针