C++中fill()、fill_n()与memset()函数的区别
fill()函数
说明
在头文件<algorithm>
里。
按照数组的始末位置以一个数组元素为单位赋值,将区间内的每一个元素都赋值为val
。
用法
fill(vector.begin(), vector.end(), val);
实例
#include <algorithm>
using namespace std;
int main() {
int n[10];
fill(n, n + 10, 2);
return 0;
}
fill()函数
说明
在头文件<algorithm>
里。
从当前起始点开始,将之后的cnt
个元素赋值为val
。
注意:不能在没有元素的空容器上调用fill_n()
函数
用法
fill(vector.begin(), cnt, val);
实例
#include <algorithm>
#include <vector>
using namespace std;
int main () {
vector<int> myvector (4,10); // myvector: 10 10 10 10
fill_n (myvector.begin(),2,20); // myvector: 20 20 10 10
return 0;
}
memset()函数
说明
在头文件<cstring>
里。
将已开辟的内存空间arr
的前cnt
个字节的值设为值val
。
理论上,因为memset()
是按照字节去赋值的,所以int
数组只能被赋值为0
(在二进制层面全为0)或者是-1
(在二进制层面全为1)。
理论上只能初始化为0和-1,但是!
偶然发现memset()
函数还能将int
型数组初始化为INF(0x3f3f3f3f)
,不是太懂是为什么,以后再想原因吧。
2021-03-24 补充
感谢 @lzhlzh007 在评论中给出解释。
赋值为
0x3f3f3f3f
是因为int
数据类型是四个字节,memset
按字节赋值,memset(a, 0x3f, sizeof(a))
意思就是把a数组中所有字节都赋值为0x3f
,0x3f
是正值,所以补码和原码一样,这样对a
中的任意一个数据a[i]
,就都变成了0x3f3f3f3f
。(计算机中存储所有数据都是补码,正数的补码是其二进制本身,负数是除符号位取反加1
所以-1
的补码是全1
)
用法
memset(arr, val, cnt);
实例
#include <cstring>
// 宏定义
#define memset(a,b) memset(a,b,sizeof(a))
using namespace std;
int main(){
int a[20];
memset(a,0); // 初始化为0
memset(a,-1); // 初始化为-1
cosnt int INF = 0x3f3f3f3f; // 定义INF常量
memset(a,INF); // 初始化为INF
return 0;
}