C++函数——fill

ops/2025/1/24 5:32:01/

在C++中,std::fill 是标准库提供的一个算法适用于几乎所有类型的容器只要这些容器支持迭代器操作。具体来说,std::fill 的适用性取决于容器是否提供了满足其要求的迭代器类型,用于将指定范围内的所有元素设置为某个特定值。它是一个类型安全的操作,非常适合对容器或数组中的元素进行初始化或赋值。

函数原型

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

#include <algorithm>template <typename ForwardIterator, typename T>
void fill(ForwardIterator first, ForwardIterator last, const T& value);

参数说明

  1. first:指向目标范围的起始位置的迭代器。

  2. last:指向目标范围的结束位置的迭代器。

  3. value:要赋给目标范围中每个元素的值。

功能

std::fill 会将 [first, last) 范围内的所有元素设置为 value。它会逐个调用元素的赋值操作符(operator=),因此可以安全地用于任意类型(包括基本数据类型、类对象等)。

使用示例

1. 初始化数组
#include <algorithm>
#include <iostream>int main() {int arr[10];std::fill(arr, arr + 10, 42);  // 将数组的每个元素设置为 42for (int i = 0; i < 10; ++i) {std::cout << arr[i] << " ";}// 输出:42 42 42 42 42 42 42 42 42 42return 0;
}
2. 初始化标准库容器
#include <algorithm>
#include <vector>
#include <iostream>int main() {std::vector<int> vec(10);std::fill(vec.begin(), vec.end(), 100);  // 将 vector 的每个元素设置为 100for (int i : vec) {std::cout << i << " ";}// 输出:100 100 100 100 100 100 100 100 100 100return 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[5];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;
}

注意事项

  1. 类型安全

    • std::fill 是类型安全的,它会调用目标元素的赋值操作符,因此可以安全地用于复杂对象。

    • memset 不同,std::fill 不会破坏对象的内部状态。

  2. 迭代器要求

    • std::fill 要求迭代器至少是正向迭代器ForwardIterator),这意味着它支持单向遍历。因此,它适用于数组、std::vectorstd::list 等容器。

  3. 性能

    • std::fill 的性能通常稍逊于 memset,因为它需要逐个调用赋值操作符。但对于复杂对象,这是唯一安全的方式。

  4. 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 非常通用,但以下情况可能需要注意:

  1. 容器为空

    • 如果容器为空(begin() == end()),std::fill 不会执行任何操作,但也不会报错。

    std::vector<int> vec;
    std::fill(vec.begin(), vec.end(), 42);  // 无操作
  2. 容器不支持迭代器操作

    • 如果容器不提供迭代器(例如某些自定义容器或非标准库容器),则无法直接使用 std::fill。这种情况下,可能需要手动实现类似的功能。

  3. 元素类型不支持赋值操作

    • 如果容器中的元素类型不支持赋值操作(例如某些不可赋值的类对象),则 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::vectorstd::arraystd::list 等)和C风格数组。它完全类型安全,可以安全地用于任意类型,包括复杂对象。只要容器提供了正向迭代器,并且元素支持赋值操作,就可以使用 std::fill

在实际使用中,std::fill 是一种非常推荐的方式,因为它符合C++的类型安全原则,并且可以无缝集成到标准库的容器操作中。

 


http://www.ppmy.cn/ops/152661.html

相关文章

【Java-数据结构】Java 链表面试题上 “最后一公里”:解决复杂链表问题的致胜法宝

我的个人主页 我的专栏&#xff1a;Java-数据结构&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 引言&#xff1a; Java链表&#xff0c;看似简单的链式结构&#xff0c;却蕴含着诸多有趣的特性与奥秘&#xff0c;等待我们去挖掘。它就像一…

(4)ACS控制器Buffer程序记录与解析-PEG功能程序

一、pandas是什么&#xff1f; 示例&#xff1a;pandas 是基于NumPy 的一种工具&#xff0c;该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.程序 代码如下&#xff08;示例&#xff09;&#xff1a; ASSIGNPEG(0),4,0 ASSIGNPOUTS(0),0,0 ENABLE 0 ACC(0)10000 …

【浙江省乡镇界】面图层shp格式arcgis数据+乡镇名称和编码+wgs84坐标无偏移内容测评

最新2020年乡镇界面图层shp格式arcgis数据乡镇名称和编码wgs84坐标无偏移。arcgis直接打开&#xff0c;单独乡镇界一个图层。品质高

密码无关认证:金融机构如何解决密码问题

密码安全问题&#xff0c;依然是金融行业面临的重大挑战。尽管密码简单易用&#xff0c;但许多金融机构仍然依赖这种方式进行身份认证。幸运的是&#xff0c;随着技术的发展&#xff0c;密码无关认证已经成为一种更加安全、便捷的选择&#xff0c;它能够为数字银行带来更好的用…

root用户Linux银河麒麟服务器安装vnc服务

安装必要桌面环境组件 yum install mate-session-manager -y mate-session #确定是否安装成功安装vnc服务器 yum install tigervnc-server -y切换到root为root得vnc设置密码 su root vncpasswd给root用户设置vnc服务器文件 vi /etc/systemd/system/vncserver:1.service [Un…

【2024年 CSDN博客之星】我的2024年创作之旅:从C语言到人工智能,个人成长与突破的全景回顾

我的2024年创作之旅&#xff1a;从C语言到人工智能&#xff0c;个人成长与突破的全景回顾 引言 回望2024年&#xff0c;我不仅收获了技术上的成长&#xff0c;更收获了来自CSDN平台上无数粉丝、朋友以及网友们的支持与鼓励。在这条创作之路上&#xff0c;CSDN不仅是我展示技术成…

c++学习第七天

创作过程中难免有不足&#xff0c;若您发现本文内容有误&#xff0c;恳请不吝赐教。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考。 一、const成员函数 //Date.h#pragma once#include<iostream> using namespace std;class Date { public:Date…

CSDN 博客之星 2024:默语的技术进阶与社区耕耘之旅

CSDN 博客之星 2024&#xff1a;默语的技术进阶与社区耕耘之旅 &#x1f31f; 默语&#xff0c;是一位在技术分享与社区建设中坚持深耕的博客作者。今年&#xff0c;我有幸再次入围成为 CSDN 博客之星TOP300 的一员&#xff0c;这既是对过往努力的肯定&#xff0c;也是对未来探…