在C++开发中,给数组或者指定内存块设置初始值是非常常见的操作,fill函数作为标准库提供的通用赋值工具,能够适配多种容器和数组类型,同时还有其他方法可以快速完成内存块的赋值,不同方法有不同的适用场景。

fill函数的基本用法
fill函数定义在<algorithm>头文件中,作用是将指定范围内的所有元素设置为给定的值,它的函数原型为:
template <class ForwardIterator, class T> void fill (ForwardIterator first, ForwardIterator last, const T& val);其中first是起始迭代器,last是结束迭代器(左闭右开区间),val是要赋的值。fill函数可以填充普通数组,也可以填充vector等标准容器。
用fill填充普通数组
普通数组可以通过指针作为迭代器传入fill函数,示例如下:
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int arr[10];
// 填充arr数组的所有元素为5
fill(arr, arr + 10, 5);
for (int i = 0; i < 10; i++) {
cout << arr[i] << " ";
}
// 输出结果:5 5 5 5 5 5 5 5 5 5
return 0;
}
用fill填充vector容器
对于vector容器,可以直接使用其begin和end迭代器,示例如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> vec(8);
// 填充vec的所有元素为3
fill(vec.begin(), vec.end(), 3);
for (int num : vec) {
cout << num << " ";
}
// 输出结果:3 3 3 3 3 3 3 3
return 0;
}
快速给内存块赋初始值的其他方法
除了fill函数之外,还有几种常用的方法可以快速给内存块赋值,不同方法的适用场景有所区别。
memset函数
memset定义在<cstring>头文件中,按字节对内存块进行赋值,适合用来给char类型数组赋值,或者给整型数组赋0、-1等特定值,但是不能用来赋其他整数值,因为会按字节填充导致结果不符合预期。
#include <iostream>
#include <cstring>
using namespace std;
int main() {
int arr[10];
// 给arr数组所有字节赋0,等价于所有元素为0
memset(arr, 0, sizeof(arr));
char str[20];
// 给字符数组赋值为'a'
memset(str, 'a', sizeof(str));
return 0;
}
初始化列表赋值
在定义数组或者vector的时候,可以直接使用初始化列表赋予初始值,适合初始值已知且数量不多的情况。
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 普通数组初始化
int arr[5] = {1, 2, 3, 4, 5};
// vector初始化
vector<int> vec = {1, 2, 3, 4, 5};
return 0;
}
fill_n函数
fill_n函数也是<algorithm>头文件中的工具,作用是给从指定位置开始的n个元素赋值,适合需要填充指定数量元素的场景。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> vec(10);
// 从vec起始位置开始,填充5个元素为7
fill_n(vec.begin(), 5, 7);
for (int num : vec) {
cout << num << " ";
}
// 输出结果:7 7 7 7 7 0 0 0 0 0
return 0;
}
不同方法的适用场景对比
为了更清晰地选择赋值方法,以下是常用方法的对比:
| 方法 | 适用场景 | 注意事项 |
|---|---|---|
| fill函数 | 任意类型的数组、容器,赋任意合法值 | 需要包含<algorithm>头文件,区间是左闭右开 |
| memset函数 | char数组赋值,整型数组赋0、-1 | 按字节赋值,不能给整型赋非0、-1的值 |
| 初始化列表 | 定义时赋少量已知初始值 | 只能在定义的时候使用,后续无法再用这种方式赋值 |
| fill_n函数 | 从指定位置开始填充指定数量的元素 | 需要确保填充的数量不超过容器或数组的大小,避免越界 |
常见注意事项
- 使用fill函数填充数组时,要确保传入的区间是有效的,避免访问越界内存。
- memset填充非char类型的数组时,只有赋0和-1是安全的,其他值会导致每个字节都被设置为该值,最终整数结果不符合预期。
- 如果填充的是自定义类型,需要保证赋值的值和自定义类型的赋值运算符兼容,否则可能出现编译错误或者运行时问题。