std函数:fill和fill_n
- 1 前言
- 2 fill函数
- 3 fill_n函数
1 前言
有时候,我们可能需要对某一块数据进行初始化,比如说,把一个int a[10] 元素初始化为-1,最简单的做法就是使用一个for循环:
for(int i=0;i<10;i++){a[i] = -1;
}
但这个方式,太单调简陋了,能做的不多,扩展性为零,而且写个for循环逐一赋值,似乎也不够高明。
std库提供了更好的方法来“填充数据”,简单学习一下。
2 fill函数
函数原型
fill函数在头文件 中声明:
template< class ForwardIt, class T >
void fill( ForwardIt first, ForwardIt last, const T& value );
函数参数
| 函数参数 | 解释说明 |
|---|---|
| first,last | 所需要修改元素的范围 |
| value | 所需要修改的值 |
ForwardIt 是一种迭代器,支持的数据类型包括数组、vector等。此外,对于超出范围的输入,是一种未定义的操作,结果视编译器而异。
函数实现
template< class ForwardIt, class T >
void fill(ForwardIt first, ForwardIt last, const T& value)
{for (; first != last; ++first) {*first = value;}
}
程序示例
/*
* @Author:Jason.Lee
* @Date: 2018-7-3
*/ #include
#include
#include using namespace std;int main(){int a[10];fill(a,a+10,6);copy(a,a+10,ostream_iterator<int>(cout," "));return 0;
}
程序结果
3 fill_n函数
fill_n函数与fill在功能上并没有太大不同,应用场景有所不同,fill是将整块数据“从头到尾”进行赋值,而fill_n是将数据的n个元素进行赋值,两者其实都能实现相同的效果。
函数原型
fill_n函数在头文件 中声明:
template< class OutputIt, class Size, class T >
void fill_n( OutputIt first, Size count, const T& value );
函数参数
| 函数参数 | 解释说明 |
|---|---|
| fitst | 所需要修改的数据块起始地址 |
| count | 所需要修改的个数 |
| value | 所需要修改的值 |
函数实现
template<class OutputIt, class Size, class T>
OutputIt fill_n(OutputIt first, Size count, const T& value)
{for (Size i = 0; i < count; i++) {*first++ = value;}
return first;
}
程序示例
/*
* @Author:Jason.Lee
* @Date: 2018-7-3
*/ #include
#include
#include using namespace std;int main(){vector<int> v = {1,2,3,4,5,6,7,8,9};fill_n(v.begin(),5,1);std::copy(v.begin(),v.end(),std::ostream_iterator<int>(cout," "));
}
程序结果
更多用法
fill_n函数只限定了输入的起始地址,对于其他的一些std函数而言,是一种便利,比如和back_inserter 函数的结合
/*
* @Author:Jason.Lee
* @Date: 2018-7-3
*/
#include
#include
#include int main(){vector<int> v;fill_n(back_inserter(v),10,1);std::copy(v.begin(),v.end(),std::ostream_iterator<int>(cout," "));
}
程序结果
back_inserter 函数是一种增量迭代插入的方式,这种方法可以动态的填装数据,避免了容量不足的情况。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
