memset 函数, fill 函数的区别及应用:
* memset函数:
1:按照字节赋值
2:头文件在<cstring>中
注:由于memset函数是按照字节赋值的,所以对int型数组用该函数时,只能是1或-1,否则会出错,这里,不管数组是多少维的,语法均为:
int dp[84][84][84][2];
memset(dp, 0, sizeof(dp)); //只能赋值0或-1
memset函数还有一个玄学的问题就是,容易TLE,又一次多效的一个题,一直T,把memset换成for循环就AC了,注意,for循环跑遍了所有的数组单元!!!
* fill函数:
1:按照变量类型单元赋值,将区间 [first, end) 中的每个单元都赋为同一个值。
2:头文件在<algorithm>中
以下是cplusplus官网代码:
// fill algorithm example
#include <iostream> // std::cout
#include <algorithm> // std::fill
#include <vector> // std::vector
int main () {
std::vector<int> myvector (8); // myvector: 0 0 0 0 0 0 0 0
std::fill (myvector.begin(),myvector.begin()+4,5); // myvector: 5 5 5 5 0 0 0 0
std::fill (myvector.begin()+3,myvector.end()-2,8); // myvector: 5 5 5 8 8 8 0 0
std::cout << "myvector contains:";
for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
我们可以直接给一维数组赋值:
int a[4] = {1, 1, 1, 1};
fill(a, a+2, 284);
// 284 284 1 1
当要给多维数组赋值时,这里的区间[first, end)都是指针地址,参看如下赋值方法:
int dp[84][84][84][2];
fill((int*)dp, (int*)dp + 84 * 84 * 84 * 2, INF);
如上所说,[first, end)都是指针地址,并且是一维的,由于 多维数组在内存空间中连续性,可将(int ****)的变量类型dp转化为(int *)类型,得到了dp的首地址,然后按照其区间给其赋值。