简介
- C++
标准库
C++ 是什么
在C++中,<ratio>
是一个头文件,定义了用于表示有理数的模板类 std::ratio
。这个头文件引入了与比例相关的模板类,允许在编译时进行精确的有理数计算,通常用于 <chrono>
头文件中,用于定义时间单位。
std::ratio
模板类
std::ratio
是一个用于表示有理数的模板类,它的声明如下:
1
2
template <std::intmax_t Num, std::intmax_t Den = 1>
class ratio;
其中:
Num
表示有理数的分子,默认为 1。Den
表示有理数的分母,默认为 1。
这个模板类用于表示编译时常量的比率,通常用于 <chrono>
中,定义了时间单位的比例。
示例
以下是一个简单的示例,展示如何使用 std::ratio
来表示一个比例:
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <ratio>
int main() {
// 表示比例为 2:3
std::ratio<2, 3> myRatio;
// 获取分子和分母
std::cout << "Numerator: " << myRatio.num << std::endl; // 输出 2
std::cout << "Denominator: " << myRatio.den << std::endl; // 输出 3
return 0;
}
在这个例子中,std::ratio<2, 3>
表示比例为 2:3 的有理数。
用途
std::ratio
的主要用途之一是在 <chrono>
头文件中,用于定义 std::chrono::duration
类型的时间单位。例如,std::ratio<1, 1000>
表示毫秒,std::ratio<60>
表示分钟,等等。这种有理数表示方式在编译时提供了更高的精确度,尤其在需要进行时间单位转换和计算的场景中非常有用。
C++ std::ratio详解
std::ratio
是 C++11 标准引入的一个模板类,用于表示有理数。它定义在 <ratio>
头文件中。这个模板类非常简单,只有两个整数模板参数,分别表示有理数的分子和分母。
以下是关于 std::ratio
的详细解释:
1. 基本语法
1
2
template <std::intmax_t Num, std::intmax_t Den = 1>
class ratio;
Num
:表示有理数的分子。Den
:表示有理数的分母,默认为 1。
2. 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <ratio>
int main() {
// 表示比例为 2:3
std::ratio<2, 3> myRatio;
// 获取分子和分母
std::cout << "Numerator: " << myRatio.num << std::endl; // 输出 2
std::cout << "Denominator: " << myRatio.den << std::endl; // 输出 3
return 0;
}
3. 成员变量
num
:表示有理数的分子。den
:表示有理数的分母。
4. 成员函数
std::ratio
提供了一些用于执行在编译时进行的算术运算的静态成员函数,例如:
add<R1, R2>
:将两个有理数相加。subtract<R1, R2>
:将一个有理数减去另一个有理数。multiply<R1, R2>
:将两个有理数相乘。divide<R1, R2>
:将一个有理数除以另一个有理数。
这些函数返回的都是新的 std::ratio
类型。
5. 应用场景
std::ratio
主要用于在编译时执行精确的比例运算,特别适用于模板元编程或其他需要在编译时进行常量计算的场景。通过使用 std::ratio
,可以避免运行时计算的误差,并在编译时得到准确的结果。
6. 示例:编译时计算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <ratio>
int main() {
using r1 = std::ratio<2, 3>;
using r2 = std::ratio<3, 4>;
// 计算两个有理数的乘积在编译时得到结果
using result_ratio = std::ratio_multiply<r1, r2>;
std::cout << "Result Numerator: " << result_ratio::num << std::endl; // 输出 6
std::cout << "Result Denominator: " << result_ratio::den << std::endl; // 输出 12
return 0;
}
这是一个简单的示例,展示了如何在编译时计算两个有理数的乘积。这种编译时计算可以用于优化和精确控制程序的行为。
C++ chrono标准库中使用std::ratio表示秒
在C++标准库中,std::chrono
提供了一种灵活的方式来表示时间间隔,并且可以使用 std::ratio
来指定时间单位。对于秒的表示,可以使用 std::ratio
中的 std::ratio<1, 1>
,因为默认情况下,std::ratio
的分子和分母都是1。
以下是一个示例,演示如何使用 std::chrono
表示秒:
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <chrono>
int main() {
// 表示 2 秒的时间间隔
std::chrono::duration<int> duration_seconds(2);
std::cout << "Duration in seconds: " << duration_seconds.count() << std::endl;
return 0;
}
在这个例子中,std::chrono::duration<int>
表示了一个时间间隔为 2 秒的对象,其中 std::ratio<1, 1>
被用作时间单位,表示秒。因为 std::ratio
是一个通用的模板类,你可以根据需要选择不同的分子和分母来表示其他时间单位。例如,使用 std::ratio<1, 1000>
表示毫秒,或者 std::ratio<60>
表示分钟。这种灵活性使得 std::chrono
非常适合处理各种时间单位和精度。
C++ std::chrono::duration 和 std::ratio
在C++中,std::chrono::duration
和 std::ratio
是与时间相关的两个重要的组件,用于实现时间单位和时间间隔的表示。
1. std::ratio
std::ratio
是一个用于表示有理数的模板类,定义在 <ratio>
头文件中。它通常用于定义时间单位的比率。例如,秒、毫秒、微秒等时间单位可以通过不同的 std::ratio
实例来表示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <ratio>
using namespace std;
int main() {
// 表示比例为 1:1000,用于表示毫秒
using milli = std::ratio<1, 1000>;
// 使用 std::chrono::duration 表示 5 毫秒
std::chrono::duration<int, milli> duration(5);
std::cout << "Duration in milliseconds: " << duration.count() << std::endl;
return 0;
}
2. std::chrono::duration
std::chrono::duration
是一个模板类,定义在 <chrono>
头文件中。它表示时间间隔,可以用不同的时间单位来表示。std::chrono::duration
接受两个模板参数:第一个表示时间的数值类型,第二个表示时间单位的类型(通常是 std::ratio
)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <chrono>
int main() {
// 表示 5 秒的时间间隔
std::chrono::duration<int> duration_seconds(5);
// 表示 500 毫秒的时间间隔
std::chrono::duration<int, std::milli> duration_milliseconds(500);
std::cout << "Duration in seconds: " << duration_seconds.count() << std::endl;
std::cout << "Duration in milliseconds: " << duration_milliseconds.count() << std::endl;
return 0;
}
3. 关系
std::ratio
用于定义时间单位的比率,而 std::chrono::duration
使用这些比率来表示时间间隔。在 std::chrono::duration
中,时间单位是通过 std::ratio
实例来指定的。这种结合可以使得时间的表示更加灵活和精确。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <chrono>
int main() {
// 表示 2.5 秒的时间间隔
std::chrono::duration<double> duration_seconds(2.5);
// 表示 2500 毫秒的时间间隔
std::chrono::duration<double, std::milli> duration_milliseconds(2500);
std::cout << "Duration in seconds: " << duration_seconds.count() << std::endl;
std::cout << "Duration in milliseconds: " << duration_milliseconds.count() << std::endl;
return 0;
}
在这个例子中,std::ratio
用于表示秒和毫秒之间的比率,而 std::chrono::duration
使用这个比率来表示时间间隔。