将std::vector<uint8_t>转换为std::string_view

6

我有一些std::vector<uint8_t>类型的数据。我想将其解释为字符串并对其进行子字符串检查。

可以通过将其转换为std::string来实现,这将导致数据复制。是否可能以某种方式将其转换为std::string_view并在其上搜索以避免复制它。


3
我们可以假设您一开始就不能使用std::vector,而是必须使用std::string吗? - user4581301
2
我不会写出一个明确的答案,因为我从未使用过 string_view,但是由于您可以从 vector 获取底层指针,所以您可能只需使用 string_view view((const char*)v.data());,但是...我不知道这是否正确。一些专家可能会发现其中的问题。 - Tas
我可以。我已经修改了它并且它可以工作。我可以删除这个问题。只是有趣的是,在我们无法将原始的std::vector<uint8_t>更改为std::string的情况下,是否可能。 - Ashot
你想要 uint8_t 视图还是实际的 char 视图? - Jarod42
Char view. 数据实际上是字符串。 - Ashot
1
你确定 uint8_tchar 的别名吗?你需要确切的 std::string_view 吗?还是 std::basic_string_view<uint8_t> 就足够了? - Caleth
1个回答

8
假设您的系统上 char 是 8 位 (大多数系统都是这样),那么您可以简单地将 vector 的数据重新解释为 char*,然后从中创建一个视图,例如:
std::vector<uint8_t> data;
...
std::string_view sv(reinterpret_cast<char*>(data.data()), data.size());

5
std::basic_string_view<uint8_t> sv(data.data(), data.size()) 可以工作吗? - Mooing Duck
1
提议的解决方案将打印字符串的内存表示。它的行为取决于charsigned还是unsigned - François Andrieux
@MooingDuck 尝试使用CTAD并删除显式的<std::uint8_t> - undefined

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