简介

  • 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::durationstd::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 使用这个比率来表示时间间隔。