前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >日更系列:用C++的std打印出漂亮的表格日志

日更系列:用C++的std打印出漂亮的表格日志

原创
作者头像
mariolu
修改2021-10-14 20:59:32
1.7K0
修改2021-10-14 20:59:32
举报

序:

给算法同学重构了一版代码。原则是边重构边测试,即使看起来有多么简单逻辑,反复测试是必不可少的。

但是没这种测试工具或者日志啥的。想说都重构了,顺便把日志功能也重构的漂亮一些。

那么现在的日志不能满足了吗?是的,满足不了各种测试边界条件。最穷举的办法就是一行代码一行log,但是这样也太显得对代码太不自信了。

一、挑战目标:

所以我构思中的日志,首先是满足算法业务日志的各种边界条件,还有包括我的输入请求参数,我的配置控制参数,中间用户和物品特征参数,最后是输出结果的变化次数。这些简而言之就是我所关心的参数。

然后用最少字符表达最多的信息量,当然想到这里用二维表格,同时少冗余信息,然后关心的东西更汇聚在一起。

假设这些关心的参数表格的列参数。那么我会用行代表算法的各种算子。

请求输入参数和中间特征数据等

统计数据

ctr修改次数

cvr修改次数

截断次数

备注

算子1

算子2

二、表的框架

2.1 行

用std::endl输出行结束符,这是我们都知道的。代表一行的结束和下一行的开始。那么单元格如何区分呢?当然我们使用 “|”代表单元格之间的分隔符。为了让边界更明显,我用两个“||”表示。这当然因人而异,看你喜好用什么符合。这里我定义“|”为小分隔符,“||”为大分割符。

代码语言:javascript
复制
     std::ostringstream oss;
     oss << std::endl //一行的开始
         << std::left << "||hit statistics||" //std::left后面会解释
         << "(items:" << pItems->size() << "||"
         << "nonZeroCtr:" << countOfNonZeroCtr << "||"
         << "nonZeroCvr:" << countOfNonZeroCvr << "||"
         << "nonZeroCtr&Cvr:" << countOfNonZeroCtrAndCvr << "||";

好了,有个重要的问题是,单元格之间怎么对齐,我要制定一个等宽空间。

std提供了这么一个 std::setw()提供设置固定宽度的输出,同时配套了std::setfill(' ') 设置用什么padding字符填充。

2.2 对齐方式

但是这里还不够,单元格提供好了,我们也想好了往里面填充什么,但是我们有个对齐的需求。

比如说我们对文字类的信息偏向于左对齐,数字之类的偏向于做友对齐。

std提供了std::left和std::right,到这里我们可以再写一版代码

代码语言:javascript
复制
     oss << ")" << std::endl
         << std::setfill(' ') << std::setw(40) << "operator:"
         << "\t" << std::right << std::setfill(' ') << std::setw(10) << "ctr:"
         << "\t" << std::setfill(' ') << std::setw(10) << "cvr:"
         << "\t" << std::setfill(' ') << std::setw(10) << "truncate:"
         << "\t" << std::left << std::setfill(' ') << std::setw(100) << "note:"
         << "\t" << std::endl;

最后我们再填入每条记录。

然后输出

代码语言:javascript
复制
std::cout << oss.str();

最终效果会类似这样:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、挑战目标:
  • 二、表的框架
    • 2.1 行
      • 2.2 对齐方式
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com