关于memset()与std::fill()函数的一些东西

1.memset()

memset()定义在cstring下。
以前一直以为是设置数组中每一个int,直到昨天dijkstra写挂了才发现这个:
memset是对每个字节进行设置。
在二进制下,int的最大值表示为:
0111 1111 1111 1111 1111 1111 1111 1111
而我当时,在代码中写的是:
memset(a, 2147483647, sizeof(a));
走投无路了把a输出,发现a全都是0。。。。。。
然后研究了一下,才发现应该要这么写:e
memset(a, 127, sizeof(a));
这样设置完后,a[i]在二进制下表示为:
0111 1111 0111 1111 0111 1111 0111 1111 = 2139062143
并不是最大值。
如果要使用memset函数设置为最大值,需要单独对后面的“0111”进行设置。

2.std::fill()

std::fill()是对每一个int进行操作,更浅显。
在 C++ 中,可以使用 std::fill 函数将数组中的所有元素设置为 int 的最大值(INT_MAX)。以下是具体实现步骤:

头文件:

algorithm:用于 std::fill。
climits:用于获取 INT_MAX。(可选,要是能记住各个最大值的话)
(int最大值可以记成0x7FFFFFFF(7后面7个F),long long就再写八个F,最小值0x80000000,ll再写8个0)
iostream:用于输出结果(可选)。
使用 std::fill 将数组填充为 INT_MAX。

示例代码

#include <algorithm> // std::fill
#include <climits>   // INT_MAX
#include <iostream>  // std::cout

int main() {
    int arr[5]; // 定义一个数组
    std::fill(arr, arr + 5, INT_MAX); // 将数组所有元素设置为 INT_MAX

    // 输出结果验证
    for (int i = 0; i < 5; ++i) {
        std::cout << arr[i] << " ";
    }
    return 0;
}

输出结果:
2147483647 2147483647 2147483647 2147483647 2147483647

说明

std::fill 是一个标准库函数,用于将指定范围内的元素填充为某个值。
INT_MAX 是 头文件中定义的常量,表示 int 类型的最大值。
在代码中,arr 是数组的起始地址,arr + 5 是数组末尾的地址(注意:arr + 5 是数组末尾的下一个位置,符合 std::fill 的要求)。
通过这种方式,可以快速将数组中的所有元素设置为 int 的最大值。

时间复杂度

均为O(n)。所以和直接循环赋值是一样的()。

posted @ 2025-03-28 22:38  林石Linstone  阅读(75)  评论(0)    收藏  举报