std::basic_string_view<T>和std::span<T>的区别

7
我正在解析二进制网络数据,并希望尽可能减少内存分配。但现在我意识到有两个非常相似的概念,它们都可能足够适用于我的情况,那就是std::basic_string_view<T>std::span<T>
所以我想知道这两者之间的区别,是否有一种比另一种更优?一个明显的区别是可用性,在C++17中已经有了std::basic_string_view,而std::span则是C++20的新特性(但您可以在老版本中使用“Guidelines Support Library”中的一个)。但还有其他方面吗?应该有,否则它们不会同时出现在标准中。

6
string_viewspan<char const>,并且具有许多字符串“便利函数”。 - dyp
正如@dyp所提到的, string_view的API具有与std :: string类似的操作,例如substr、copy、find等。 - Mansoor
1
同样的原因,vectorbasic_string都存在。 - Alan Birtles
@AlanBirtles basic_string 至少保证了空字符结尾。但是对于 string_view 并非如此(是否计划推出空字符结尾的 string_view?)。 - dyp
1个回答

1

string_view 是用于处理文本数据的。而 span 则是用于处理任意对象数组的。虽然两者都不是二进制数据的完美选择,但可以明显看出 string_view 不适合处理二进制数据。


1
我说的是 basic_string_view,不是 string_view。第一个是模板,而第二个是该模板的一个特定实例,其中 T=char - Youda008
1
答案适用于basic_string_view及其所有实例化。 - Sneftel
可能需要提及 Traits 参数。 - Caleth
3
@Sneftel 我不明白为什么 basic_string_view<uint8_t> 不适用于二进制数据,我认为它非常适用。 - Youda008
我认为@Youda008是正确的,如果basic_string_view指向一个vector<T>或类似空间的C风格数组,它应该具有与string_view相同的特性。我也尝试在自己的解析器设计中使用视图结构。 - ollydbg23

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接