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

4 篇文章 0 订阅

以往对一个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等前缀等,需要修改对<<的重载

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值