C++ fill 、 fill_n & memset函数
C++ fill 、 fill_n & memset函数
在写程序时,往往需要对某一容器内的元素进行清零或赋值处理,我们来看看c++ 中fill(),fill_n()和memset()这三个函数是如何做的吧:
1、fill()与fill_n()函数
因为是面向容器的操作,这两个函数包含在<algorithm>头文件中。
fill()函数原型为
template<class ForwardIterator, class T>
void fill(ForwardIterator first, ForwardIterator last, const T& value);</span>
因此可以通过其对数组元素进行统一赋值操作,而省去了for循环的麻烦,注意赋值区间为一个半开半闭区间[first,last),所以last不包括在内
完整程序示例如下:
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int a[5];
<span style="white-space:pre"> </span>fill(a,a+5,2);
for(int i=0; i<5;++i)
<span style="white-space:pre"> </span>printf("%d ",a[i]);
>return 0;
}
输出结果为
2 2 2 2 2<span style="font-family: Arial, Helvetica, sans-serif;"> </span><img src="" alt="" style="font-family: Arial, Helvetica, sans-serif;" />
当然也可以用fill_n达到同样的效果
fill_n的函数原型为
template<class OutputIterator, class Size, class Type> void fill_n(OutputIterator _First,Size _Count, const Type& _Val);其中_First为起始地址,_Count为从_Fisrst开始要赋值的元素个数,_val为要赋的值
完整代码示例如下:
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
<span style="white-space:pre"> </span>int a[5];
<span style="white-space:pre"> </span>fill_n(a,5,2);
for(int i=0; i<5;++i)
printf("%d ",a[i]);
return 0;
}
输出结果为2 2 2 2 2
2、memset()函数
大家最熟悉的莫过于此函数,很多时候对于数组的清零操作往往靠它实现,但是能否完成上述如fill()或fill_n()的功能呢,首先看一下它的原型:
c++中memset()包含在<memory>头文件中
void *memset(void *s, int ch, size_t n);
其中s为所指向的内存,ch为要赋的值,而n为元素个数乍看起来,与上述两个函数,尤其是find_n()很相似,但是要记住memset是按字节赋值的,当将ch置为2时,对于上例中的数组中的每个元素的每个字节都置为2,亦即对
任意的i(i=0...4),a[i]=0x02020202(十进制即为33686018)
程序示例如下:
#include<cstdio>
#include<memory>
using namespace std;
int main()
{
int a[5];
memset(a,2,sizeof(a));
for(int i=0; i<5;++i)
printf("%d ",a[i]);
return 0;
}
运行结果为:33686018 33686018 33686018 33686018 33686018
所以memset通常用于清零操作~