C++函数——fill

server/2025/1/24 19:47:32/

在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/server/161099.html

相关文章

Wireshark TS | 虚假的 TCP Spurious Retransmission

前言 在写《TCP Analysis Flags 系列》文章时梳理出不少有趣的案例&#xff0c;当然过程当中也有很多的疑问&#xff0c;嗯&#xff0c;自得其乐。考虑到不同的系列偏重不太一样&#xff0c;因此在 TroubleShooting 系列中我再把有些案例单独展开说说。 问题背景 TCP Spurio…

Maven运行任何命令都报错“Internal error: java.lang.ArrayIndexOutOfBoundsException”

今天遇到一个奇怪的问题&#xff0c;在maven工程下运行任何mvn命令都报“Internal error: java.lang.ArrayIndexOutOfBoundsException”错误&#xff0c;具体错误如下&#xff1a; $ mvn install [INFO] Scanning for projects... [ERROR] Internal error: java.lang.ArrayInd…

【C++】类和对象(二)

示例&#xff1a;对属性和行为加以权限限制 #include<iostream> #include<string> using namespace std; class person { public :string m_name;//姓名 protected:string m_car;//汽车 private :int m_password;//银行卡密码 public:void func(){m_name "…

LLMs的星辰大海:大语言模型的前世今生

文章目录 一. LLM 的演进&#xff1a;从规则到智能的跃迁 &#x1f4ab;1.1 语言模型的蹒跚起步 &#x1f476;1.2 RNN 与 LSTM&#xff1a;序列建模的尝试 &#x1f9d0;1.3 Transformer 的横空出世&#xff1a;自注意力机制的革命 &#x1f4a5;1.4 LLM &#xff1a;从预测到…

亚博microros小车-原生ubuntu支持系列:5-姿态检测

MediaPipe 介绍参见&#xff1a;亚博microros小车-原生ubuntu支持系列&#xff1a;4-手部检测-CSDN博客 本篇继续迁移姿态检测。 一 背景知识 以下来自亚博官网 MediaPipe Pose是⼀个⽤于⾼保真⾝体姿势跟踪的ML解决⽅案&#xff0c;利⽤BlazePose研究&#xff0c;从RGB视频…

Elasticsearch(ES)基础查询语法的使用

1. Match Query (全文检索查询) 用于执行全文检索&#xff0c;适合搜索文本字段。 { “query”: { “match”: { “field”: “value” } } } match_phrase&#xff1a;精确匹配短语&#xff0c;适合用于短语搜索。 { “query”: { “match_phrase”: { “field”: “text” }…

回首2024,展望2025

2024年&#xff0c;是个充满挑战与惊喜的年份。在这366个日夜里&#xff0c;我站在编程与博客的交汇点&#xff0c;穿越了无数的风景与挑战&#xff0c;也迎来了自我成长的丰收时刻。作为开发者的第十年&#xff0c;我依然步伐坚定&#xff0c;心中始终带着对知识的渴望与对自我…

使用Chrome和Selenium实现对Superset等私域网站的截图

最近遇到了一个问题&#xff0c;因为一些原因&#xff0c;我搭建的一个 Superset 的 Report 功能由于节假日期间不好控制邮件的发送&#xff0c;所以急需一个方案来替换掉 Superset 的 Report 功能 首先我们需要 Chrome 浏览器和 Chrome Driver&#xff0c;这是执行数据抓取的…