是否有用于子字符串的标准库 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
.
字符串视图不是复制您正在操作的字符串,而是为基础字符串提供 视图 - 几乎只是指向字符串开头和大小的指针
我有一个很大的只读字符串,我扫描了它的语法,并基于这个简单的语法提取了一堆较小的字符串,稍后我将使用这些字符串进行进一步处理。根据测试,将大部分大字符串创建并复制到小字符串中是一种性能瓶颈(每个大字符串有数千个)。
我认为我实际上并不需要为 - 分配数据,也不需要复制数据。我真正需要的是一种字符串片段类型,它只会存储指向相关数据开头和长度的指针,但与此同时,它应该是 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
.
字符串视图不是复制您正在操作的字符串,而是为基础字符串提供 视图 - 几乎只是指向字符串开头和大小的指针