c++ fill()和fill_n() 函数
关于
fill 和fill_n函数是C++ Primer第十二章泛型算法部分内容,并把它们称为生成和变异算法,也就是说这两个函数只能对输入范围内已存在的元素进行操作。如果试图对空容器进行fill_n操作,会导致严重的运行错误,所以在对元素进行写入操作时要检查目标的大小是否足以存储要写入的元素。
fill函数原型:
参考:http://www.cplusplus.com/reference/algorithm/fill/
template <class ForwardIterator, class T> void fill(ForwardIterator first, ForwardIterator last, const T& val) { while (first != last) { *first = val; ++first; } }
fill函数的作用是:将一个区间的元素都赋予val值。函数参数:fill(vec.begin(), vec.end(), val); val为将要替换的值。
// 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; }
fill函数原型:
参考:http://www.cplusplus.com/reference/algorithm/fill_n/
template <class OutputIterator, class Size, class T> OutputIterator fill_n(OutputIterator first, Size n, const T& val) { while (n>0) { *first = val; ++first; --n; } return first; // since C++11 }
fill_n函数的作用是:将val分配给first指向的序列的前n个元素。
// fill_n example #include <iostream> // std::cout #include <algorithm> // std::fill_n #include <vector> // std::vector int main() { std::vector<int> myvector(8, 10); // myvector: 10 10 10 10 10 10 10 10 std::fill_n(myvector.begin(), 4, 20); // myvector: 20 20 20 20 10 10 10 10 std::fill_n(myvector.begin() + 3, 3, 33); // myvector: 20 20 20 33 33 33 10 10 std::cout << "myvector contains:"; for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it) std::cout << ' ' << *it; std::cout << '\n'; return 0; }
注意: 不能在没有元素的空容器上调用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个元素。