简介

  • C++函数常用函数

C++ std::isnan() 函数 详解

std::isnan() 是 C++ 标准库中的一个函数,用于检查一个浮点数是否为 NaN(Not a Number)。

NaN 是 IEEE 浮点数表示中的一个特殊值,它通常表示一个未定义或不可表示的结果,比如 0/0 的结果或者负数的平方根。NaN 的特点是无法与任何其他浮点数进行比较,包括它自己,因此检查一个值是否为 NaN 是很有用的。

std::isnan() 函数的声明位于 <cmath> 头文件中,并且提供了重载版本以支持不同的浮点类型。常见的版本有:

1
2
3
bool isnan(float arg) noexcept;       // 检查 float 是否为 NaN
bool isnan(double arg) noexcept;      // 检查 double 是否为 NaN
bool isnan(long double arg) noexcept; // 检查 long double 是否为 NaN

函数接受一个浮点数作为参数,并返回一个布尔值,表示参数是否为 NaN。如果参数是 NaN,则返回 true,否则返回 false

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <cmath>

int main() {
    double nanValue = std::nan("");
    double normalValue = 42.0;

    std::cout << std::boolalpha; // 以布尔形式输出
    std::cout << "Is nanValue NaN? " << std::isnan(nanValue) << std::endl;
    std::cout << "Is normalValue NaN? " << std::isnan(normalValue) << std::endl;

    return 0;
}

在这个示例中,std::nan("") 创建了一个 NaN 值的双精度浮点数。然后通过 std::isnan() 函数检查这个值,以及一个普通的值是否为 NaN,并输出结果。

std::ostringstream 详解

std::ostringstream 是 C++ 标准库中的一个类,位于 <sstream> 头文件中,用于在内存中创建和操作字符串。它是 std::ostream 的子类,因此可以使用类似于输出流的方式将数据写入其中,但数据将被存储为字符串。

std::ostringstream 主要用于构建动态生成的字符串,例如将不同类型的数据(如整数、浮点数、字符串等)格式化为一个字符串。

以下是关于 std::ostringstream 的详细说明:

  1. 创建对象: 可以通过以下方式创建 std::ostringstream 对象:

    1
    2
    3
    
    #include <sstream>
    
    std::ostringstream oss;
    
  2. 写入数据: std::ostringstream 提供了与输出流类似的操作符,可以用于将不同类型的数据写入流中。常用的操作符有 <<

    1
    2
    3
    4
    5
    
    int num = 42;
    double pi = 3.14159;
    std::string name = "Alice";
    
    oss << "Number: " << num << ", Pi: " << pi << ", Name: " << name;
    
  3. 获取字符串: 使用 std::ostringstream 后,可以通过调用 .str() 成员函数来获取内部存储的字符串。

    1
    
    std::string result = oss.str();
    
  4. 清除内容: 调用 std::ostringstream 对象的 .str("") 成员函数可以清除流中的内容,重新使用该流。

    1
    2
    
    oss.str(""); // 清除内容
    oss << "New content.";
    
  5. 格式化输出: 可以使用格式化操作来控制输出的样式。比如使用 std::setw() 来设置输出字段的宽度。

    1
    2
    3
    4
    5
    
    #include <iomanip>
    
    int value = 123;
    oss << "Value: " << std::setw(6) << std::setfill('0') << value;
    // 输出:"Value: 000123"
    
  6. 异常处理: 与流操作类似,std::ostringstream 也可以引发异常,如格式错误或其他问题。可以使用 .good().eof().fail() 等成员函数来检查流的状态。

    1
    2
    3
    
    if (!oss.good()) {
        // 处理流异常
    }
    

std::ostringstream 是一个强大的工具,用于将不同类型的数据格式化为字符串,以便于输出、日志记录等任务。它适用于需要在内存中操作字符串数据而不直接写入文件或输出流的情况。

std::clamp()

std::clamp() 是 C++17 标准引入的一个函数,用于限制一个值的范围。它的目的是将一个值夹在指定的最小值和最大值之间,如果它小于最小值,就返回最小值,如果它大于最大值,就返回最大值。这个函数非常有用,因为它可以帮助你确保一个值不会越界。

std::clamp() 的函数签名如下:

1
2
template <class T>
constexpr const T& clamp(const T& value, const T& lo, const T& hi);

这个函数有三个参数:

  1. value:要限制范围的值。
  2. lo:最小值。
  3. hi:最大值。

函数会返回一个与 value 具有相同类型的值,它会被夹在 lohi 之间。如果 value 小于 lo,则返回 lo;如果 value 大于 hi,则返回 hi;否则,返回 value 本身。

下面是一个示例,演示了如何使用 std::clamp() 函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <algorithm>

int main() {
    int value = 5;
    int min_val = 1;
    int max_val = 10;
    
    int result = std::clamp(value, min_val, max_val);
    
    std::cout << "Clamped value: " << result << std::endl;
    
    return 0;
}

在这个示例中,value 的值为 5,min_valmax_val 分别是 1 和 10。std::clamp() 函数将 value 夹在 min_valmax_val 之间,因此 result 的值将是 5,因为它在指定的范围内。

std::clamp() 函数的参数类型可以是任何支持比较运算符的类型,例如整数、浮点数、字符等。这个函数是一种很方便的方法,用于确保值在指定的范围内,而不需要编写额外的条件语句来进行检查和修正。