是否有子字符串的标准库类?

问题描述

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

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

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

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

解决方法

是的,从 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 的地方。

字符串视图不是复制您正在操作的字符串,而是为底层字符串提供视图——几乎只是指向字符串开头和大小的指针。 >