您的位置:首页 > 运维架构

使用std::copy以及ostream_iterator快速对数组操作

2016-07-12 15:45 549 查看
以往对一个array进行输出时,往往使用for循环,虽然什么不好的地方,简单明了,但是代码中冗余行数太多。

先来一个输出array的例子

int buf[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
copy(buf, buf+10, ostream_iterator<int>(cout, " "));


够简单吧,有些时候输出的时候需要输出十六进制,并且字节对齐什么的,如hex, std::setw, set::setfill之类的格式,如下代码可以解决

template <typename T, int W>
struct FixedWidthVal{
FixedWidthVal(T v_) : v(v_) {}
T v;
};
template <typename T, int W>
std::ostream& operator<< (std::ostream& ostr, const FixedWidthVal<T,W> &fwv) {
return ostr << hex << std::setw(W) << std::setfill('0') << fwv.v;
}

copy(buf, buf+recv_cnt, ostream_iterator<FixedWidthVal<int, 2> >(cout, " "));

一个现实的例子是从socket里面接收的报文进行源码输出来

stringstream note_ss;//存放到stringstream中,这样不论是输出终端还是输出文件都很容易解决
note_ss << "RECV ";
// 模拟从socket中接收数据
int buf[] = {
0x68,0x14,0x02,0x00,0x00,0x00,0x67,0x01,0x06,0x00,
0x00,0x00,0x00,0x00,0x00,0x12,0x34,0x0C,0x13,0x01,
0x07,0x10};
copy(buf, buf+sizeof(buf)/sizeof(int),
ostream_iterator<FixedWidthVal<int, 2> >(note_ss, " "));
cout << note_ss.str();//输出终端,有了stringstream写入文件也是很easy的事情
这样也可以在原始报文中加入0x等前缀等,需要修改对<<的重载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: