Boost开发指南-1.2progress_display

news2024/9/21 20:23:25

Progress_display

progress_display可以在控制台上显示程序的执行进度,如果程序执行很耗费时间,那么它能够提供一个友好的用户界面,不至于让用户在等待中失去耐心。

progress_display位于名字空间boost,为了使用progress_display组件,需要包含头文件<boost/progress.hpp>,即:

#include <boost/progress.hpp>
using namspace boost;

类摘要

progress_display是一个独立的类,与 timer库中的其他两个组件——timer 和progress_timer没有任何联系,它的类摘要如下:

class progress_display : noncopyable
{
 public:
    progress_display( unsigned long expected_count );
    progress_display( unsigned long expected_count_,
                             std::ostream & os,
                             const std::string & s1 = "\n", 
                             const std::string & s2 = "",
                             const std::string & s3 = "" );

  void           restart( unsigned long expected_count );
  
  unsigned long  operator+=( unsigned long increment );
  
  unsigned long  operator++();
  unsigned long  count() const;
  unsigned long  expected_count() const;
};

progress_display的构造函数接受一个long型的参数expected_count,表示用于进度显示的基数,是最常用的创建progress_display的方法。

另一种形式的构造函数除了基数和流输出对象外,还接受三个字符串参数,定义显示的三行首字符串。但这个构造函数有点小问题,流输出对象通常都应该是cout,把进度输出到文件或者其他用户看不到的地方似乎没有多大的意义。

在构造后progress_display对象会显示出一个类似图形化进度条的界面,用两行以字符的形式显示百分比进度,像这样:
在这里插入图片描述
重载的加法操作符operator+=和 operator++用来增加计数,并在第三行用字符*显示进度百分比 count() / expected_count。成员函数count()可以返回当前的计数,当计数到达基数expected_count时表示任务已经完成,进度为100%。

用法

假设我们要把一些存储在std::vector中的字符串以每个一行的形式写入到文本文件中,因为字符串数量很多,而且有的很大,因此可能操作会耗费很多时间。progress_display可以让程序有一个友好的人机界面,让用户知道程序的进度。

使用progress_display首先要调用它的构造函数,传入进度基数,如:

progress_display pd(v.size());

随后就可以使用它重载的加法操作符(++pd)来根据程序的运行情况增加计数,直到完成任务。

#include <iostream>
#include <vector>
using namespace std;

// disable pragma warning
#define BOOST_ALLOW_DEPRECATED_HEADERS

#include <boost/progress.hpp>
using namespace boost;

//

void case1()
{
	vector<string> v(100); //一个字符串向量
	ofstream fs("./test.txt"); //文件输出流
    //声明一个progress_display对象,基数是v的大小
	//progress_display pd(v.size(),cout ,"%%%", "+++", "???");
	progress_display pd(v.size());

    //开始迭代遍历向量 处理字符串 写入文件
	for (auto& x : v)  //for+auto循环
	{
		fs << x << endl; //更新进度显示
		++pd;
	}
}

//

void case2()
{
	vector<string> v(100, "aaa");

	v[10] = ""; v[23] = "";
	ofstream fs("./test.txt");
	progress_display pd(v.size());

	for (auto pos = v.begin(); pos != v.end(); ++pos)  //使用迭代器遍历容器
	{
		fs << *pos << endl;
		++pd;
		if (pos->empty())
		{
			cout << "null string # "
				<< (pos - v.begin()) << endl;
		}
	}
}

//

int main()
{
	case1();
	case2();
}

在这里插入图片描述
当程序处理了75个字符串时,控制台的显示大概如下:
在这里插入图片描述
如果改用progress_display另一种形式的构造函数,如:

progress_display pd(v.size(),cout ,"%%%", "+++", "???");

那么显示就会变成这样:
在这里插入图片描述
这种输出形式颇有点“画蛇添足”的味道,建议读者最好不要这么用。

注意事项

progress_display可以用作基本的进度显示,但它有个固有的缺陷:无法把进度显示输出与程序的输出分离。

这是因为progress_display和所有c++程序一样,都向标准输出(cout)输出字符,如果使用progress_display的程序也有输出操作,那么progress_display的进度显示就会一片混乱。

仍然使用刚才的写入文本文件的例子,我们希望显示进度的同时还能报告空的字符串的行号,像这样:
在这里插入图片描述
如case2一样,似乎一切都很好,但实际的运行结果却是:
在这里插入图片描述
很显然,for循环中的输出打乱了progress_display的正常输出,而 progress_display对此毫不知情,仍然按部就班地显示着百分比进度。

这个显示混乱的问题很难解决,因为我们无法预知庞大的程序之中哪个地方会存在一个可能会干扰progress_display的输出。一个可能(但远非完美〉的办法是在每次显示进度时都调用restart()重新显示进度刻度,然后用operator+=来指定当前进度,而不是简单地调用operator++,例如:

pd.restart(v.size());
pd += (pos - v.begin() + 1);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/547508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内网自建代理ChatGPT

使用GPT比较频繁&#xff0c;一开始翻墙还能接受&#xff0c;但是用美国节点访问其他国外网站&#xff0c;确实比较麻烦。因此决定自己转发一个出来。 一、获取OpenAI授权密钥 首先&#xff0c;进入platform.openai.com-Personal-View API keys 不过OpenAI的key并不是免费的&…

VMware虚拟机三种网络模式详解之Bridged(桥接模式)

VMware虚拟机三种网络模式详解 Bridged&#xff08;桥接模式&#xff09; 由于Linux目前很热门&#xff0c;越来越多的人在学习Linux&#xff0c;但是买一台服务放家里来学习&#xff0c;实在是很浪费。那么如何解决这个问题&#xff1f;虚拟机软件是很好的选择&#xff0c;常…

登高作业安全带穿戴识别系统 yolov5

登高作业安全带穿戴识别系统通过yolov5python网络框架模型技术&#xff0c;登高作业安全带穿戴识别算法模型实现对登高作业人员是否穿戴安全带进行监测并及时发出警报。YOLO系列算法是一类典型的one-stage目标检测算法&#xff0c;其利用anchor box将分类与目标定位的回归问题结…

前端web入门-HTML-day02

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 列表 无序列表 有序列表 定义列表 表格 基本使用 合并单元格 跨列合并 跨行合并 表单 input …

网络安全里主要的岗位有哪些?小白如何快速入门学习黑客?

入门Web安全、安卓安全、二进制安全、工控安全还是智能硬件安全等等&#xff0c;每个不同的领域要掌握的技能也不同。 当然入门Web安全相对难度较低&#xff0c;也是很多人的首选。主要还是看自己的兴趣方向吧。 本文就以下几个问题来说明网络安全大致学习过程&#x1f447; 网…

软件设计师 数据库刷题项并包含知识点总结

**两级映像 有概念模式和内模式跟物理独立性相关&#xff0c;有外模式和概念模式跟逻辑独立性相关 ** 属性列就是RS共同拥有的ABC&#xff0c;一般去除后面的&#xff0c;所以就只有前面三个ABC&#xff0c;元组就是有没有自然连接成功的&#xff0c;就是R.AS.A R.BS.B… 选项里…

[人工智能原理]

软件工程 定义 采用工程概念、原理、技术、方法来开发、维护软件&#xff0c;把经过时间考验而证明正确的管理技术和当前能够得到的最好技术方法结合起来&#xff0c;经济开发出高质量软件并有效的维护 基本目标 目标 可用性 正确性 合算性 原则 采用适合的开发范型、开…

计算机操作系统(慕课版)第一章课后题答案

第一章 操作系统引论 一、简答题 1.在计算机系统上配置OS的目标是什么&#xff1f;作用表现在哪几个方面&#xff1f; 在计算机系统上配置OS&#xff0c;主要目标是实现&#xff1a;方便性、有效性、可扩充性和开放性&#xff1b; OS的作用主要表现在以下3个方面&#xff1a; 1…

matplotlib后端@backend@高清图输出格式控制@SVG格式输出

文章目录 notebookmatplotlib&#x1f388;matplotlib backendbackendfrontend后端类型AGG配置后端Note不区分大小写三种配置方式在matplotlibrc文件中使用rcParams["backend"]参数&#xff1a;使用MPLBACKEND环境变量&#xff1a;使用matplotlib.use()函数&#xff…

阿里三面过了,却无理由挂了,HR反问一句话:为什么不考虑阿里?

进入互联网大厂一般都是“过五关斩六将”&#xff0c;难度堪比西天取经&#xff0c;但当你真正面对这些大厂的面试时&#xff0c;有时候又会被其中的神操作弄的很是蒙圈。 近日&#xff0c;某位测试员发帖称&#xff0c;自己去阿里面试&#xff0c;三面都过了&#xff0c;却被…

SpringCloud微服务调用方式(RestTemplate)

服务调用方式 RPC和HTTP 无论是微服务还是SOA&#xff0c;都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢&#xff1f; 常见的远程调用方式有以下2种&#xff1a; RPC&#xff1a;Remote Produce Call远程过程调用&#xff0c;类似的还有 。自定义数据格式&am…

由浅入深Netty组件实战

目录 1 EventLoop1.1 演示 NioEventLoop 处理 io 事件1.2 演示 NioEventLoop 处理普通任务1.3 演示 NioEventLoop 处理定时任务 2 Channel2.1 ChannelFuture2.2 CloseFuture 3 Future & Promise3.1 例1&#xff1a;同步处理任务成功3.2 例2&#xff1a;异步处理任务成功3.3…

Navicat premium 15激活教程及安装教程+报错解决办法

Navicat premium 15激活教程及安装教程报错解决办法 1、安装包和注册工具下载2、安装Navicate Premium 15&#xff0c;直接下一步安装即可&#xff0c;安装位置可以按照到D盘3、激活Navicate Premium 15打开安装包里面的Navicat Keygen Patch v5.6.0 DFoX.exe工具当点击path选择…

看完这篇文章你就彻底懂啦{保姆级讲解}-----(I.MX6U驱动UART串口通信) 2023.5.20

目录 前言整体文件结构源码分析&#xff08;保姆级讲解&#xff09;串口驱动初始化部分UART1数据收发函数部分 编译结果验证结束语 前言 串口是我们在开发过程中最常用到的外设&#xff0c;所以我们必须掌握。 整体文件结构 源码分析&#xff08;保姆级讲解&#xff09; 串口…

[Leetcode刷题] - LC075 Sort Colors

题目描述 一个随机序列包含0&#xff0c;1&#xff0c;2 在不占用额外内存的情况下将序列排序。 题目思路 1. 计数排序 计数排序思路比较简单&#xff0c;记录三个数字出现频率&#xff0c;然后根据频率将0&#xff0c;1&#xff0c;2重新加入数组&#xff0c;思路较为简单…

【数据结构】--单链表力扣面试题④找链表中倒数第k个结点

目录 法一、遍历链表法 法二、快慢指针法 题述&#xff1a;输入一个链表&#xff0c;输出该链表中倒数第k个结点 示例&#xff1a; 输入:1,[1,2,3,4,5] 返回值:[5] 已知链表的定义和函数头FindKthToTail&#xff0c;让你完善FindKthToTail函数 struct ListNode { int…

基于html+css的图展示81

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

探索Vue的组件世界-组件复用

目录 Mixin【混入】 缺陷 HOC&#xff08;higher order component&#xff09;【高阶组件】 相比较Mixin的优点&#xff1a; 不足&#xff1a; Renderless组件【函数式组件&#xff0c;无渲染组件&#xff0c;Vue社区使用比较多的一种业务复用模式】 优点&#xff1a; M…

网上书城系统的设计与实现

背景 设计一个网上书城管理系统&#xff0c;通过这个系统能够满足网上书城的管理及用户的图书信息管理及购物功能。系统的主要功能包括&#xff1a;首页、个人中心、用户管理、图书类型管理、图书分类管理、图书信息管理、我的收藏管理、系统管理、订单管理等功能。 管理员可…

5号与25号发工资的差别这么大?我居然才知道(文末附招聘岗位)

可能是新一轮的毕业季马上就来了&#xff0c;最近热搜上出现了很多关于工作&#xff0c;收入与存款的热点。诸如#年入20万是什么水平# …… 前面的话题小编已经在上篇文章说过了&#xff0c;感兴趣的朋友可以点击这里围观↓↓↓ 『在中国&#xff0c;年收入20W是什么水平&am…