C++11:便利的工具

目录

  • 1 处理日期和时间的chrono库
    • 1.1 记录时长的duration
    • 1.2 表示时间点的time point
    • 1.3 获取系统时钟的clocks
  • 2 数值类型和字符串的相互转换
  • 3 宽窄字符转换

1 处理日期和时间的chrono库

1.1 记录时长的duration

duration表示一段时间间隔,用来记录时间长度,可以表示几秒、几分钟或者几个小时的时间间隔。duration的原型如下:

template<
	class Rep,
	class Period = std::ratio<1,1>
> class duration;

第一个模板参数Rep是一个数值类型,表示时钟数的类型;第二个模板参数是一个默认模板参数std::ratio,表示时钟周期,它的原型如下:

template<
	std::intmax_t Num,
	std::intmax_t Denom = 1
>class ratio;

它表示每个时钟周期的秒数,其中第一个模板参数Num代表分子,Denom代表分母,分母默认为1,因此,ratio代表的是一个分子除以分母的分数值,比如ratio<2>代表一个时钟周期是两秒, ratio<60>代表一分钟, ratio<60 * 60>代表一个小时, ratio<60 * 60 * 24>代表一天。而ratio<1,1000>代表的则是1/1000秒,即一毫秒,ratio<1, 1 000 000>代表一微秒,ratio<1,1 000 000 000>代表一纳秒。为了方便使用,标准库定义了一些常用的时间间隔,如时、分、秒、毫秒、微秒和纳秒,在 chrono命名空间下,它们的定义如下:

typedef duration <Rep, ratio<3600,1>> hours;
typedef duration <Rep, ratio<60,1>> minutes;
typedef duration <Rep, ratio<1,1>> seconds;
typedef duration <Rep, ratio<1,1000>> milliseconds;
typedef duration <Rep,ratio<1,1000000>> microseconds;
typedef duration <Rep,ratio<1,1000000000>> nanoseconds;

通过定义这些常用的时间间隔类型,我们能方便地使用它们,比如线程的休眠:

std::this_thread::sleep_for(std::chrono::seconds(3));	//休眠3秒
std::this_thread::sleep_for(std::chrono::milliseconds(100));	//休眠100毫秒

chrono还提供了获取时间间隔的时钟周期数的方法count(),它的基本用法如下:

#include <chrono>
#include <iostream>
int main ()
{
	std::chrono::milliseconds ms{3};	//3毫秒
	std::chrono::microseconds us = 2*ms;	//6000微秒
	std::chrono::duration<double, std::ratio<1, 30>> hz30 {3.5}; //30Hz clock using fractional ticks
	std: :cout <<"3 ms duration has " << ms.count () << " ticks \n"
	<<"6000 us duration has " << us.count ( ) << " ticks\n";
}

输出如下:
3 ms duration has 3 ticks
6000 us duration has 6000 ticks
时间间隔之间可以做运算,计算两端时间间隔的差值的示例如下:

std::chrono::minutes t1(10);
std::chrono::seconds t2(60) ;
std::chrono::seconds t3 = t1 - t2;
std::cout<< t3.count () <<" second" << std: :endl;

其中,t1代表10分钟、t2代表60秒,t3则是t1减去t2,也就是600-60=540秒。通过调用t3的count输出差值为540个时钟周期,因为t3的时钟周期为1秒,所以t3表示的时间间隔为540秒。

1.2 表示时间点的time point

time_point 表示一个时间点,用来获取从它的clock 的纪元开始所经过的duration(比如,可能是1970.1.1以来的时间间隔)和当前的时间,可以做一些时间的比较和算术运算,可以和ctime库结合起来显示时间。time_point必须用clock 来计时。time_point有一个函数time_from_eproch()用来获得1970年1月1日到 time_point时间经过的duration。下面是计算当前时间距离1970年1月1日有多少天的示例。

#include <iostream>
#include <ratio>
#include <chrono>

int main()
{
	using namespace std:: chrono;
	typedef duration<int, std:: ratio<60*60*24>> days_type;
	time_point<system_clock, days_type> today =
	time_point_cast<days_type>(system_clock::now());
	std::cout << today.time_since_epoch().count() << " days since epoch" <<std:: endl;
	return 0;
}

time_point还支持一些算术运算,比如两个time_point的差值时钟周期数,还可以和duration相加减。要注意不同clock 的time_point是不能进行算术运算的。下面的例子输出前一天和后一天的日期。

#include <iostream>
#include <iomanip>
#include <ctime>
#include <chrono>

int main()
{
	using namespace std::chrono;
	system_clock::time_point now = system_clock::now();
	std::time_t last = system_clock::to_time_t(now - hours(24));
	std::time_t next = system_clock::to_time_t(now + hours(24));
	std::cout << "One day ago, the time was "
	<< std::put time(std::localtime(&last),"%F %T") << '\n ';
	std::cout << "Next day, the time is "
	<< std::put_time(std::localtime(&next)"%F %T") << '\n ';
}

输出如下:
one day ago, the time was 2014-3-2622:38: 27
Next day, the time is 2014-3-2822:38:27
需要注意的是,上面的代码在vs2013下能编译通过,但在GCC下是不能编译通过的,因为GCC 还没有支持std::put_time。

1.3 获取系统时钟的clocks

clocks表示当前的系统时钟,内部有time_point、duration、Rep、Period等信息,主要用来获取当前时间,以及实现time_t和 time _point的相互转换。clocks包含如下3种时钟:
system_clock: 代表真实世界的挂钟时间,具体时间值依赖于系统。system_clock 保证提供的时间值是一个可读时间。
steady_clock: 不能被“调整”的时钟,并不一定代表真实世界的挂钟时间。保证先后调用now()得到的时间值是不会递减的。
high_resolution_clock: 高精度时钟,实际上是system_clock或者steady_clock 的别名。可以通过now()来获取当前时间点,代码如下:

#include <iostream>
#include <chrono>
int main ()
{
	std::chrono::system_clock::time_point t1 = std::chrono::system_clock::now();
	std::cout<<"Hello world\n" ;
	std::chrono::system_clock::time_point t2 = std::chrono::system_clock::now();
	std::cout<< (t2-t1).count()<<"tick count"<<std::endl;
}

输出如下:
Hello world
97tick count
system_clock和std::put_time配合起来使用可以格式化日期的输出。下面的例子是将当前时间格式化输出。

#include <chrono>
#include <ctime>
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
int main ()
{
	auto t = chrono::system_clock::to_time_t(std::chrono::system_clock::now());
	cout<< std::put_time(std::localtime(&t),"%Y-%m-%d %x")<<endl;
	cout<< std::put_time(std:: localtime(&t),"%Y-%m-%d %H.%M.%S")<<endl;
	return 0;
}

输出结果如下:
2014-3-27 22:11: 49
2014-3-27 22.11.49

2 数值类型和字符串的相互转换

C++11提供了to_string方法,可以方便地将各种数值类型转换为字符串类型:
std::string to_string( int value ) ;
std::string to_string( long value ) ;
std::string to_string( long long value ) ;
std::string to_string( unsigned value );
std::string to_string( unsigned long value );
std::string to_string( unsigned long long value );
std::string to_string( float value );
std::string to_string( double value );
std::string to_string( long double value );

std::wstring to_wstring( int value );
std::wstring to_wstring( long value );
std::wstring to_wstring( long long value );
std::wstring to_wstring( unsigned value );
std::wstring to_wstring( unsigned long value ) ;
std::wstring to_wstring( unsigned long long value );
std::wstring to_wstring( float value ) ;
std::wstring to_wstring( double value );
std::wstring to_wstring( long double value );

C++11还提供了字符串转换为整型和浮点型的方法:
atoi:将字符串转换为int类型。
atol:将字符串转换为long类型。
atoll:将字符串转换为long long类型。
atof:将字符串转换为浮点型。

#include <iostream>
#include <string>

int main(void)
{
	double f = 1.53;
	std::string f_str = std::to_string(f);
	std::cout << f_str << std::endl;

	double f1 = 4.125;
	std::wstring f_str1 = std::to_wstring(f1);
	std::wcout << f_str1 << std::endl;

	const char* str1 = "10";
	const char* str2 = "3.1415926";
	const char* str3 = "31337 with words";
	const char* str4 = "words and 2";

	int num1 = std::atoi(str1);
	int num2 = std::atoi(str2);
	int num3 = std::atoi(str3);
	int num4 = std::atoi(str4);
	double f2 = std::atof(str2);

	std::cout << "std::atoi(\"" << str1 << "\") is " << num1 << '\n'; 
	std::cout << "std::atoi(\"" << str2 << "\") is " << num2 << '\n'; 
	std::cout << "std::atoi(\"" << str3 << "\") is " << num3 << '\n'; 
	std::cout << "std::atoi(\"" << str4 << "\") is " << num4 << '\n'; 
	std::cout << "std::atoi(\"" << str2 << "\") is " << f2 << std::endl; 

	system("pause");
	return 0;
}

输出结果如下:
std::atoi(“10”) is 10
std::atoi(“3.14159”) is 3
std::atof (“31337 with words”) is 31337
std::atoi ( “words and 2”) is 0
如果需要转换的字符串前面部分不是数字,会返回0,上面的str4转换后返回0; 如果字符串的前面部分有空格和含数字,转换时会忽略空格并获得前面部分的数字。

3 宽窄字符转换

C++11增加了unicode字面量的支持,可以通过L来定义宽字符:

std::wstring str = L”中国人";	//定义unicode字符串

将宽字符串转换为窄字符串需要用到codecvt库中的std::wstring_convert。std::wstring_convert需要借助unicode转换器:

#include <iostream>
#include <string>
#include <codecvt>

int main(void)
{
	std::wstring str = L"我是中国人yzb";
	std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t>> 
		converter(new std::codecvt<wchar_t, char, std::mbstate_t>("CHS"));

	std::string narrowStr = converter.to_bytes(str);
	std::wstring wstr = converter.from_bytes(narrowStr);
	std::cout << narrowStr << std::endl;

	std::wcout.imbue(std::locale("chs"));  //初始化cout为中文输出
	std::wcout << wstr << std::endl;

	system("pause");
	return 0;
}

输出结果如下:
中国人
中国人

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Robosense激光雷达Linux配置

文章目录1.1 速腾rs16连接&#xff1a;1.2 网络配置1&#xff09;官方说明2&#xff09;设置网络3&#xff09;检查是否连接成功2.1 激光雷达ROS包下载/编译1)下载ROS包2&#xff09;安装libpcap依赖3&#xff09;修改编译模式4&#xff09;config文件配置5&#xff09;编译并运…

AI-TestOps —— 软件测试工程师的一把利剑

写在前面软件测试的前世今生测试工具开始盛行AI-TestOps 云平台● AI-TestOps 功能模块● AI-TestOps 自动化测试流程写在前面 最近偶然间看到一句话&#xff1a;“软件测试是整个 IT 行业中最差的岗位”。这顿时激起了我对软件测试领域的兴趣&#xff0c;虽然之前未涉及过软件…

《Flutter进阶》flutter升级空安全遇到的一些问题及解决思路

空安全出来挺久了&#xff0c;由于业务需求较紧&#xff0c;一直没时间去升级空安全&#xff0c;最近花了几天去升级&#xff0c;发现其实升级也挺简单的&#xff0c;不要恐惧&#xff0c;没有想象中的多BUG。 flutter版本从1.22.4升到3.0.5&#xff1b; compileSdkVersion从1…

日撸 Java 三百行day11-13

文章目录说明day11-day12 顺序表1.面向过程面向对象区别2.代码2.1 面向过程2.2 面向对象day13 链表1.成员内部类2.链表的插入删除3.代码说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了…

【51单片机】:LED任务及汇编解释任务

学习目标&#xff1a; 1、用汇编或者c语言实现D1 D3 D5 D7 为一组 &#xff1b;D2 D4 D6 D8 为一组 &#xff0c;两组实现 1&#xff09;一组亮约一秒 另一组灭一秒&#xff0c;这样的互闪现象五次后 25分 2&#xff09;所有灯灭约一秒后&#xff0c; …

关于ChatGPT的一些随笔

大家好&#xff0c;我是老三&#xff0c;最近几个月关于ChatGPT的信息可以说是铺天盖地。 “王炸&#xff0c;ChatGPT……” “xxx震撼发布……” “真的要失业了&#xff0c;xxx来袭……” “普通如何利用ChatGPT……” …… 不过老三前一阵比较忙&#xff0c;对ChatGPT…

ElasticSearch简介

第一章 ElasticSearch简介 1.1 什么是ElasticSearch Elaticsearch&#xff0c;简称为es&#xff0c; es是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理PB…

【数据结构与算法】树与二叉树

目录一.树1.树的定义2.结点的分类与关系3.树的相关概念4.树的表示方法二.二叉树1.二叉树的定义2.特殊二叉树3.二叉树的性质4.二叉树的顺序结构5.二叉树的链式结构(1)链式结构的创建(2)结点的创建(3)二叉树的手动构建(4)前中后序遍历(5)二叉树结点个数(6)二叉树的高度(7)第k层的…

Docker目录迁移

介绍 在docker的使用中随着下载镜像越来越多&#xff0c;构建镜像、运行容器越来越多, 数据目录必然会逐渐增大&#xff1b;当所有docker镜像、容器对磁盘的使用达到上限时&#xff0c;就需要对数据目录进行迁移。 如何避免&#xff1a; 1.在安装前对/var/lib/docker&#x…

如何3步精读《PMBOK指南》(含PMP备考资料)

初学者学习《PMBOK指南》的确有点吃亏&#xff0c;比不得那些项目管理专业以及相关专业的毕业生&#xff0c;哪怕只稍微接触过项目的都比初学者强。 所以&#xff0c;有计划性的阅读就显得尤为重要&#xff0c;要克服的不仅是阅读上的枯燥&#xff0c;还有专业知识的理解&…

Java——JDK动态代理

1.动态代理 1.1什么是动态代理&#xff1f; 动态代理(理解) 基于反射机制 举个例子&#xff0c;生活中一般在打官司的时候都会请代理律师&#xff0c;为什么要请律师呢&#xff1f;是因为开庭的时候大部人对于打官司没有经验&#xff0c;只会说出自己案件的陈述&#xff0c;并不…

软硬皆施,WMS仓库管理系统+PDA,实现效率狂飙

人工经验Excel表格&#xff0c;是传统第三方仓储企业常用的管理模式。在这种管理模式下&#xff0c;对仓库员工的Excel操作能力、业务经验和工作素养要求极高。一旦员工的经验能力不足&#xff0c;就会导致仓库业务运行不顺畅&#xff0c;效率低下&#xff0c;而员工也会因长时…

【MySQL】基于GTID的半同步主从复制(实践)

一、GTID简介 什么是GTID? 全局事务标识符GTID的全称为Global Transaction Identifier&#xff0c;是在整个复制环境中对一个事务的唯一标识。 它是MySQL 5.6加入的一个强大特性&#xff0c;目的在于能够实现主从自动定位和切换&#xff0c;而不像以前需要指定文件和位置。 …

ArduPilot飞控之DIY-F450计划

ArduPilot飞控之DIY-F450计划1. 历史2. 源由3. 计划3.1 硬件3.2 软件4. 动手4.1 接线4.1.1 ELRS nano接收机4.1.2 BN880 GPS模块4.1.3 Radio Telemetry4.2 配置4.2.1 选择四轴机型4.2.2 电源参数调整4.2.3 校准加速度计4.2.4 校准磁力计4.2.5 遥控器校准4.2.6 电机设置4.2.7 电…

企业电子招投标采购系统——功能模块功能描述+数字化采购管理 采购招投标

​ 功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外…

Melis4.0[D1s]:4.测试笔记 - 内嵌的显示命令

文章目录1.配置将显示测试源码包含进工程&#xff08;默认是包含了&#xff09;2.不要启动melis桌面系统3.开始测试3.1 disp 命令3.1.1 disp不带参数时&#xff0c;打印显示信息&#xff1a;3.1.2 disp -c 0 8 测试4种颜色3.2 disp_layer_cfg 命令3.3 disp_mem 对显示内存写入内…

全球自动驾驶竞争力最新排行榜,4家中国企业上榜

发展至今&#xff0c;自动驾驶技术不仅是汽车行业的一个主战场&#xff0c;更是全球科技领域中备受关注和充满竞争的一个重要领域。近年来&#xff0c;各大汽车制造商和科技公司都在投入大量财力物力人力进行自动驾驶技术的研发&#xff0c;并进一步争夺市场份额。 当然&#…

人工智能前沿——「小海带」超全视觉注意力机制资源分享(附下载链接)

&#x1f4da;&#x1f4da; 人工智能 | 计算机视觉 —— 致力于目标检测领域科研Tricks改进与推荐 | 主要包括主干网络改进、轻量化网络、注意力机制、检测头部改进、空间金字塔池化、损失函数及NMS改进、ICCV/CVPR/ECCV视觉顶会创新点改进、各类数据集资源分享以及算法训练相…

智云通CRM:如何给客户创造尽可能安全的成交环境?

销售人员要想和客户顺利成交&#xff0c;给对方创造尽可能安全的成交环境尤为重要。销售人员的每一句话和每一个观点&#xff0c;应当都是客户所想的。客户是非常聪明的&#xff0c;有任何风吹草动&#xff0c;他们都会提高警惕&#xff0c;这就是客户跟销售人员之间关系的现状…

笔记:关于使用vitepress 制作静态站点并托管到gitee

笔记&#xff1a;关于使用vitepress 制作静态站点并托管到giteegiteejcLee95&#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/129419979…
最新文章