fill 和fill_n函数是C++ Primer第十二章泛型算法部分内容,并把它们称为生成和变异算法,也就是说这两个函数只能对输入范围内已存在的元素进行操作。如果试图对空容器进行fill_n操作,会导致严重的运行错误,所以在对元素进行写入操作时要检查目标的大小是否足以存储要写入的元素。
fill函数的作用是:将一个区间的元素都赋予val值。函数参数:fill(vec.begin(), vec.end(), val); val为将要替换的值。
- # include <algorithm>
- fill(vec.begin(), vec.end(), val); //原来容器中每个元素被重置为val
注意: 不能在没有元素的空容器上调用fill_n函数,但是可以通过下面的方法改进。
- fill_n(vec.begin, 10, val);
为了保证算法有足够的元素存储输出数据,我们使用“插入迭代器”(insert iterator),插入迭代器是可以给基础容器添加元素的迭代器。
使用 back_inserter 的程序需要包含头文件#include<iterator>,将上面的程序改写成:
- #include <iterator>
- vector<int> vec; //定义一个空容器
- fill_n (back_inserter(vec), 10 val);
在这个程序中,fill_n() 函数每写入一个值,都会通过back_inserter生产的插入迭代器实现。效果相当于在vec上调用push_back,在vec末尾添加10个元素。
【C++】fill函数,fill与memset函数的区别
-
memset函数
- 按照字节填充某字符
- 在头文件
<cstring>
里面
-
fill函数
- 按照单元赋值,将一个区间的元素都赋同一个值
- 在头文件
<algorithm>
里面
-
因为memset函数按照字节填充,所以一般memset只能用来填充char型数组,(因为只有char型占一个字节)如果填充int型数组,除了0和-1,其他的不能。因为只有00000000 = 0,-1同理,如果我们把每一位都填充“1”,会导致变成填充入“11111111”
-
而fill函数可以赋值任何,而且使用方法特别简便:
- fill(arr, arr + n, 要填入的内容);
- 例如:
#include <cstdio>#include <algorithm>using namespace std;int main() { int arr[10]; fill(arr, arr + 10, 2); return 0;}
- vector也可以:
#include <algorithm>#include <vector>#include <iostream>using namespace std;int main(){ vector<int> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; fill(v.begin(), v.end(), -1); return 0;}
- 而memset的使用方法是:
#include <iostream>#include <cstring>using namespace std;int main(){ int a[20]; memset(a, 0, sizeof a); return 0;}