尚未崩坏 发表于 2025-11-4 22:29:21

C++函数——fill

https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYzE5MzMzY2MxYzY1NDY5NWFkNzdhMWUzZGVjNjdkM2EuZ2lm
在C++中,std::fill 是标准库提供的一个算法实用于险些全部范例的容器,只要这些容器支持迭代器利用。详细来说,std::fill 的实用性取决于容器是否提供了满意其要求的迭代器范例,用于将指定范围内的全部元素设置为某个特定值。它是一个范例安全的利用,非常得当对容器或数组中的元素举行初始化或赋值。
函数原型

std::fill 的函数原型界说在 <algorithm> 头文件中:

#include <algorithm>

template <typename ForwardIterator, typename T>
void fill(ForwardIterator first, ForwardIterator last, const T& value);参数分析


[*]        first:指向目标范围的起始位置的迭代器。
[*]        last:指向目标范围的竣事位置的迭代器。
[*]        value:要赋给目标范围中每个元素的值。
功能

std::fill 会将 [first, last) 范围内的全部元素设置为 value。它会逐个调用元素的赋值利用符(operator=),因此可以安全地用于恣意范例(包罗根本数据范例、类对象等)。
使用示例

1. 初始化数组


#include <algorithm>
#include <iostream>

int main() {
    int arr;
    std::fill(arr, arr + 10, 42);// 将数组的每个元素设置为 42

    for (int i = 0; i < 10; ++i) {
      std::cout << arr << " ";
    }
    // 输出:42 42 42 42 42 42 42 42 42 42
    return 0;
}2. 初始化标准库容器


#include <algorithm>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec(10);
    std::fill(vec.begin(), vec.end(), 100);// 将 vector 的每个元素设置为 100

    for (int i : vec) {
      std::cout << i << " ";
    }
    // 输出:100 100 100 100 100 100 100 100 100 100
    return 0;
}3. 初始化复杂对象


#include <algorithm>
#include <iostream>

struct Data {
    int a;
    double b;

    Data(int x, double y) : a(x), b(y) {}
};

int main() {
    Data arr;
    std::fill(arr, arr + 5, Data(10, 3.14));// 将数组的每个元素初始化为 Data(10, 3.14)

    for (const auto& d : arr) {
      std::cout << "a: " << d.a << ", b: " << d.b << std::endl;
    }
    // 输出:
    // a: 10, b: 3.14
    // a: 10, b: 3.14
    // ...
    return 0;
}留意事项


[*]        范例安全:

[*]                std::fill 是范例安全的,它会调用目标元素的赋值利用符,因此可以安全地用于复杂对象。
[*]                与 memset 差异,std::fill 不会粉碎对象的内部状态。
       
[*]        迭代器要求:

[*]                std::fill 要求迭代器至少是正向迭代器(ForwardIterator),这意味着它支持单向遍历。因此,它实用于数组、std::vector、std::list 等容器。
       
[*]        性能:

[*]                std::fill 的性能通常稍逊于 memset,由于它须要逐个调用赋值利用符。但对于复杂对象,这是唯一安全的方式。
       
[*]        与 std::fill_n 的区别:

[*]                std::fill 利用的是一个范围 [first, last)。
[*]                std::fill_n 利用的是从某个起始位置开始的 n 个元素。比方:
               
std::vector<int> vec(10);
std::fill_n(vec.begin(), 5, 42);// 从 vec.begin() 开始,填充 5 个元素为 42
       
总结

std::fill 是一个非常实用的算法,实用于须要对容器或数组中的元素举行初始化或赋值的场景。它完全范例安全,可以安全地用于恣意范例,包罗复杂对象。在C++中,发起优先使用 std::fill 或其他标准库算法,而不是直接利用内存(如 memset),除非须要高效处理处罚原始内存。
不实用的环境

固然 std::fill 非常通用,但以下环境大概须要留意:

[*]        容器为空:

[*]                假如容器为空(begin() == end()),std::fill 不会实行任何利用,但也不会报错。
       
std::vector<int> vec;
std::fill(vec.begin(), vec.end(), 42);// 无操作       
[*]        容器不支持迭代器利用:

[*]                假如容器不提供迭代器(比方某些自界说容器或非标准库容器),则无法直接使用 std::fill。这种环境下,大概须要手动实现雷同的功能。
       
[*]        元素范例不支持赋值利用:

[*]                假如容器中的元素范例不支持赋值利用(比方某些不可赋值的类对象),则 std::fill 会报错。
       
class NonAssignable {
public:
    NonAssignable() = default;
    NonAssignable& operator=(const NonAssignable&) = delete;
};

std::vector<NonAssignable> vec(10);
std::fill(vec.begin(), vec.end(), NonAssignable());// 编译错误       
总结

std::fill 是一个非常通用的算法,实用于险些全部支持迭代器利用的容器,包罗标准库容器(如 std::vector、std::array、std::list 等)和C风格数组。它完全范例安全,可以安全地用于恣意范例,包罗复杂对象。只要容器提供了正向迭代器,而且元素支持赋值利用,就可以使用 std::fill。
在实际使用中,std::fill 是一种非常保举的方式,由于它符合C++的范例安全原则,而且可以无缝集成到标准库的容器利用中。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvOGU4YTcwNGNjNzYwNDcxNGEwNTkxNTY2NjRjYjc1YmQucG5n 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: C++函数——fill