如何使用istream_iterator将无符号字符向量转换为字符串?
How could I use istream_iterator to convert unsigned char vector to a string?
我可以用普通的循环来做到这一点:
vector<unsigned char> v{3, 13, 23, 83};
stringstream ss;
for (auto &el : v)
ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(el);
cout << ss.str() << endl;
我正在寻找允许我使用 std::copy 的方法:
std::copy(
std::begin(v),
std::end(v),
std::ostream_iterator<int>(ss << std::hex << std::setw(2) << std::setfill('0'))
);
它没有给我与 for 循环方法相同的输出值。 我对此有两个问题:
- 我怎样才能让它工作,以便 std::copy 方法提供与 for 循环方法相同的输出值和格式?
- 这两种方法在理论上哪个更好?
您使用 std::copy 的方法与
ss << std::hex << std::setw(2) << std::setfill('0');
std::copy(
std::begin(v),
std::end(v),
std::ostream_iterator<int>(ss)
);
std::setw 设置的宽度在第一次输出操作后消失,因此只有第一个字符的输出才会有它。
要使用 std::copy,您必须编写一个自定义迭代器,而不是使用 std::ostream_iterator。
您的第一种方法更好,因为它更短且更容易理解。
为了使用标准算法和输出迭代器,我们可以定义一个新类并重载流插入运算符<<
。运算符<<
由std::copy
为我们要流式传输的每个项目调用。
template <class T>
class HexOut
{
public:
HexOut(T val) : value(val)
{
}
friend std::ostream& operator<<(std::ostream& os, const HexOut<T>& elem)
{
os << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(elem.value) << std::dec;
return os;
}
private:
T value;
};
int main()
{
std::vector<unsigned char> v{ 3, 13, 23, 83 };
std::copy(v.begin(), v.end(), std::ostream_iterator<HexOut<unsigned char>>(std::cout));
return 0;
}
在这里,运算符<<
每次都设置正确的输出标志,并将无符号字符转换为整数。如您所见,我们必须编写更多代码并定义一个新类。对于这样的简单任务来说,这可能是矫枉过正。但是,使用迭代器可以跨不同类型的流移植,我们利用了许多算法函数,例如std:copy
.另外,所有格式都包含在运算符<<
中,这使得它更易于维护。
相关文章:
- NLOHMANN 的 JSON 库将数组转换为结构向量
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 将CHW格式的浮点向量转换为cv::Mat
- 将元组的向量转换/构造为堆
- 将转换字符键入 int 以用作向量C++的索引
- 如何将向量中的可变参数转换为参数的持有者?
- 如何将整数字符串转换为整数的二维向量?
- C++如何将字符数组转换为字节向量(向量<byte>)
- 如何在C++中将字节向量(std::vector<uint8_t>)转换为不同的uint32_t,uint16_t和uint8_t变量
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- 将编译时常量向量转换为堆分配版本
- 在 Cython 中将C++向量转换为 numpy 数组,而无需复制
- 在<uint8_t> <char> c++ 中将常量向量转换为常量向量
- C++ 将地址保存为字符串的向量转换为新的向量
- 如何使用 STL 算法将整数向量转换为字符串向量?
- 基类到派生类的强制转换向量
- 带有基类指针的强制转换向量,指向子类
- C++ 强制转换向量<无符号字符>到无符号字符 *
- 在 C 语言中转换C++向量的实现
- static_cast无法转换向量的地址