前面一节我们学习了区间交换算法remove()函数等移除算法,读者是否还记得它们的功能分别是什么吗?没错,remove()函数能够移除与目标元素完全相等的元素,如果想要自定义比较规则可使用remove_if()函数,需要将与目标元素不等的元素复制到另外一个容器可以使用remove_copy()函数,如果既要定义比较规则又要复制不等元素那就使用remove_copy_if()函数。本节我们将学习一个新的算法——填充算法,顾名思义,填充算法指的是对一个区间进行指定元素的快速填充。fill()函数就是一个重要的填充函数,”fill“的意思是”填满“,从名称上就能看出这个函数的功能是对一个区间进行指定元素的快速填充。
它的语法格式如下:
template< class ForwardIt, class T > void fill( ForwardIt first, ForwardIt last, const T& value );
fill(first,last,val)函数指的把val填满区间[first,last)。下面我们通过代码演示一下:
#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
#include<string>
using namespace std;
/*fill(first,last,val)函数*/
void test() {
vector<int> v{1,2,3,4,5};
cout << "未填充前:";
for_each(v.begin(), v.end(), [](const int& n){
cout << n<<" ";
});
cout << '\n';
/*把0填充满v容器*/
fill(v.begin(),v.end(),0);
cout << "填充0后:";
for_each(v.begin(), v.end(), [](const int& n){
cout <<n<< " ";
});
}
int main(){
system("title dotcpp.com");
test();
return 0;
}编译结果如下:

可以看到,我们通过fill(first,last,val)函数把v容器全部填满0,输出完全符合我们的预期。
当然,我们并不止步于此,如果读者想要从指定位置填充几个指定元素,我们可以使用fill_n()函数。
fill_n()函数语法格式如下:
template< class OutputIt, class Size, class T > OutputIt fill_n( OutputIt first, Size count, const T& value );
fill(first,n,val)函数表示的是从迭代器first位置开始,我们填充n个val,这里我们通过代码实操一下:
#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
#include<iterator> //需要用到迭代器函数next()函数
#include<string>
using namespace std;
/*fill(first,n,val)函数*/
void test() {
vector<int> v{1,2,3,4,5};
cout << "未填充前:";
for_each(v.begin(), v.end(), [](const int& n){
cout << n<<" ";
});
cout << '\n';
/*从第三个元素开始填充3个0*/
fill_n(next(v.begin(),2),3,0);
cout << "填充0后:";
for_each(v.begin(), v.end(), [](const int& n){
cout <<n<< " ";
});
}
int main(){
system("title dotcpp.com");
test();
return 0;
}编译结果如下:

对于序列{1,2,3,4,5},我们从第3个元素开始连续填充3个元素,实现{1,2,0,0,0}的输出,输出完全符合我们的预期。
总结:我们可以通过fill()函数对指定序列填充目标元素,如果想要指定填充元素的个数,我们可以使用fill_n()函数;在蓝桥杯、ACM等算法竞赛上,fill() 函数常应用于初始化数组。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程