我有一个很大的字节向量,我想取出其中的一部分,将这些字节解释为以十六进制系统编写的 ASCII 字符,并将该子字符串打印在屏幕上。我不需要副本,所以我想使用
std::basic_string_view<uint8_t>
。下面的代码将导致编译错误(“no match for 'operator<<' (operand types are 'std::ostream' {aka 'std::basic_ostream'} and 'std::basic_string_view'").
What is the best way to print the substring without any copies?
(在下面的示例中,我不想在屏幕上显示“cde”)
#include <cstdint>
#include <iostream>
#include <string_view>
#include <vector>
int main() {
std::vector<uint8_t> v { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 };
std::basic_string_view<uint8_t> b { v.begin() + 2, v.begin() + 5 };
std::cout << b << std::endl;
return 0;
}
std::cout
是一个 std::basic_ostream<char>
,这意味着仅定义了 std::string_view<char>
的流运算符的重载,请参阅 https://en.cppreference.com/w/cpp/string/basic_string_view/operator_ltlt。
如果您想打印
std::basic_string_view
,您只需将其传递给具有相同字符类型的流,否则您必须使用自己的函数打印字符串。
如果您想创建
std::string_view
,您可以将 std::vector
的类型更改为 std::vector<char>
或在创建 char
时强制转换为 string_view
:
std::basic_string_view<char> sv{ reinterpret_cast<char*>(v.data()) + begin, end - begin };
std::cout << sv << std::endl;