c++的STL库里的fill
C++ STL 中 fill 函数的用法与扩展
fill(a, a+n, 0)
是 C++ 标准库 <algorithm>
中 fill
函数的一个典型用法。这个表达式的含义是:
- 将数组
a
中从起始位置到第n
个元素(共n
个元素)的值全部设置为0
基本语法和用法
fill
函数的基本语法如下:
cpp
运行
fill(first, last, value);
其中:
first
:指向要填充的第一个元素的迭代器last
:指向要填充的最后一个元素之后位置的迭代器value
:要赋给范围内每个元素的值
这个函数可以用于任何支持迭代器的容器,包括数组、vector、list 等。
示例代码
下面是一些使用 fill
函数的示例:
cpp
运行
#include <iostream>
#include <algorithm>
#include <vector>
#include <array>int main() {// 填充普通数组int arr[10];fill(arr, arr + 10, 5); // 将数组arr的所有元素设置为5// 填充vectorstd::vector<int> vec(10);fill(vec.begin(), vec.end(), 10); // 将vector的所有元素设置为10// 填充数组的部分区域fill(arr + 3, arr + 7, 0); // 将arr[3]到arr[6]设置为0// 打印数组for (int i = 0; i < 10; i++) {std::cout << arr[i] << " ";}std::cout << std::endl;// 打印vectorfor (int val : vec) {std::cout << val << " ";}std::cout << std::endl;return 0;
}
扩展用法
除了基本的 fill
函数外,STL 还提供了一些相关的函数:
-
fill_n:填充指定数量的元素
cpp
运行
fill_n(arr, 5, 100); // 将arr的前5个元素设置为100
-
iota:生成连续递增的值(C++11 引入)
cpp
运行
#include <numeric> iota(arr, arr + 10, 1); // 生成序列:1, 2, 3, ..., 10
-
使用 lambda 表达式进行自定义填充:
cpp
运行
#include <iostream> #include <algorithm> #include <vector>int main() {std::vector<int> vec(5);int value = 1;// 使用lambda表达式填充递增的值std::generate(vec.begin(), vec.end(), [&value]() { return value++; });for (int val : vec) {std::cout << val << " ";}std::cout << std::endl;return 0; }
注意事项
fill
函数的时间复杂度是 O (n),其中 n 是填充范围的大小- 对于基本数据类型(如 int、double 等),使用
fill
比循环赋值更简洁 - 对于自定义类型,确保该类型支持赋值操作
- 在使用
fill_n
时要确保目标容器有足够的空间,否则会导致未定义行为
fill
函数是 STL 中一个简单但非常实用的工具,特别是在需要批量初始化数据时。