当前位置: 首页 > news >正文

C++函数——fill

在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.lryc.cn/news/525310.html

相关文章:

  • 二叉树(了解)c++
  • 备赛蓝桥杯之第十五届职业院校组省赛第三题:产品360度展示
  • 业余无线电 对讲机常用频率使用
  • 个性化的语言模型构建思路
  • QT开发技术【QFileDialog卡顿问题】
  • 关于为什么java中nextInt()和nextLine()不能混用 | nextInt()和nextInt()之类的可以一起用
  • Android OpenGL(六) 纹理
  • git和idea重新安装后提交异常
  • leetcode刷题记录(八十一)——236. 二叉树的最近公共祖先
  • STM32-CAN总线
  • node.js 07.npm下包慢的问题与nrm的使用
  • ubuntu改变swap存储空间,遇到 fallocate 失败: 文本文件忙
  • 20250122-正则表达式
  • QT之CMAKE教程
  • 网络安全 | 0day漏洞介绍
  • 关于WPF中ComboBox文本查询功能
  • 07_游戏加载窗口
  • awk命令进阶
  • 解锁Java中的国密算法:安全保障的密钥
  • 基于迁移学习的ResNet50模型实现石榴病害数据集多分类图片预测
  • 在现有 Docker Desktop 环境下安装与配置独立 Kubernetes环境(Mac)
  • Linux探秘坊-------3.开发工具详解(1)
  • Spring Boot整合Thymeleaf、JDBC Template与MyBatis配置详解
  • 白玉微瑕:闲谈 SwiftUI 过渡(Transition)动画的“口是心非”(下)
  • 论文:深度可分离神经网络存内计算处理芯片
  • hdrnet,Deep Bilateral Learning for Real-Time Image Enhancement解读
  • Android系统开发(十五):从 60Hz 到 120Hz,多刷新率进化简史
  • js判断一个数组对象中是否有相同的值
  • 基于深度学习的视觉检测小项目(十五) 用户的登录界面
  • redis-排查命中率降低问题