最近学习一本C++ Library Reference的电子书,感觉跟翻字典似的,本文是抄录下来的学习笔记之一。

一些算法写入元素值,但算法本身并不取检验容器本身。

比如fill,fill_n

1先看下fill函数

函数声明:

template<class ForwardIterator, class T>

void fill(ForwardIterator first, ForwardIterator last, const T& value);

函数解释:

设置区间[first,last)的元素值为value。

函数行为可能类似于这样:

template<class ForwardIterator, class T>

void fill(ForwardIterator first, ForwardIterator last, const T& value)

{

while (first!=last) *first++ = last;

}

例子:

//fill algorithm example

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

int main()

{

vector<int> myvector(8);//myvector:0 0 0 0 0 0 0 0

fill(myvector.begin(),myvector.begin()+4,5);//myvector:5 5 5 5 0 0 0 0

fill(myvector.begin()+3,myvector.end()-2,8);//myvector:5 5 5 8 8 8 0 0

cout << "myvector contains:";

for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)

cout << " " << *it;

cout << endl;

return 0;

}


输出:

myector contains: 5 5 5 8 8 8 0 0

注意如果vector大小跟fill不符合的话,相当于在用指针操作未申请的指针区域,会有段错误。不过注意用vector.begin(),vector.end()来限制的话,应该是不会出错的。但接下来的fill_n使用相比要更加小心才行。

2.fill_n函数

函数声明:

template<class OutputIterator, class Size, class T>

void fill_n(OutputIterator first, Size n, const T& value);

函数解释:

给first之后n个元素赋值,值为value。

函数行为类似与这样:

template<class OutputIterator, class Size, class T>

void fill_n(OutputIterator first, Size n, const T& value)

{

for (; n>0; --n) *first++ = value;

}

例子:

//fill_n example

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

int main()

{

vector<int> myvector(8,10);//myvector:10 10 10 10 10 10

fill_n(myvector.begin(), 4, 20);//myvector:20 20 20 20 10 10 10 10

fill_n(myvector.begin()+3 , 3, 33);//myvector:20 20 20 33 33 33 10 10

cout << "myvector contains:";

for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)

cout << " " << *it;

cout << endl;

return 0;

}


输出:

myvector contains: 20 20 20 33 33 33 10 10

《C++Primer》里提到:

对指定数目的元素做写入运算,或者写到目标迭代器的算法,都不检查目标的大小是否足以存储要写入的元素。