问题描述
我想说的是“只要我们在一定时间内,就可以继续进行迭代”
此代码看起来像
int time = atoi(argv[1]);
auto start = std::chrono::high_resolution_clock::Now();
while((std::chrono::duration_cast<chrono::milliseconds>(std::chrono::high_resolution_clock::Now() - start).count()) < time){
/*perform operation*/
}
但是我无法与这样的时间进行比较,并得到错误error: conversion to ‘double’ from ‘std::chrono::duration<long int,std::ratio<1,1000> >::rep {aka long int}’ may alter its value [-Werror=conversion]
有人知道如何使用chrono与小于操作符进行比较吗?
解决方法
错误在优先级上,您在count()
函数之后执行了强制转换,这导致强制转换超过double
值。
可以通过以下方式解决问题:
int time = atoi(argv[1]);
auto start = std::chrono::high_resolution_clock::now();
while(((std::chrono::duration_cast<chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start)).count()) < time){
/*perform operation*/
}
,
int time = atoi(argv[1]);
time
是什么单位? seconds
? nanoseconds
?对于这个答案,我假设使用seconds
,但将其更改为您需要的任何值:
std::chrono::seconds time{atoi(arv[1])};
下一步:
auto start = std::chrono::high_resolution_clock::now();
high_resolution_clock
将成为system_clock
或steady_clock
的类型别名。 The top of this answer explains the difference.我建议根据您的需要选择system_clock
或steady_clock
,而不要让供应商为您选择。
while((std::chrono::duration_cast<chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start).count()) < time){
/*perform operation*/
}
-
始终尝试停留在计时类型系统中,而不要使用
.count()
退出它。退出chrono库后,它将不再对您有帮助。在这种情况下,这意味着使用计时单位而不是int
进行比较。 -
比较计时单位时,不需要强制转换使得比较的两边都是相同的单位。例如,可以比较
seconds
和milliseconds
。 chrono会考虑不同的单位正确进行比较。
我喜欢发布功能范围using namespace std::chrono
,因为我发现重复的std::chrono::
过于冗长,使代码更难阅读。
using namespace std::chrono;
seconds time{atoi(arv[1])};
auto start = steady_clock::now();
while(steady_clock::now() - start < time)
{
// perform operation
}
或者您可以代数重新排列:
while(steady_clock::now() < start + time)
{
// perform operation
}
在rhs中加上“常量”,您可以收集并重命名该名字:
auto finish = steady_clock::now() + seconds{atoi(arv[1])};
while(steady_clock::now() < finish)
{
// perform operation
}
以上所有内容都是等效的,因此您可以选择更易读的内容。