1. 程式人生 > >C++ 之 fill()、fill_n()、 back_inserter

C++ 之 fill()、fill_n()、 back_inserter

fill 的標頭檔案是<iostream> 名稱空間是std;

fill 和fill_n函式是C++ Primer第十一章泛型演算法部分內容,並把它們稱為寫入元素演算法,也就是說這兩個函式只能對輸入範圍內已存在的元素進行寫入操作。如果試圖對空容器進行fill_n操作,會導致嚴重的執行錯誤,所以在對元素進行寫入操作時要檢查目標的大小是否足以儲存要寫入的元素。

fill函式的作用是:將一個區間的元素都賦予val值。函式引數:fill(vec.begin(), vec.end(), val); val為將要替換的值。

  1. # include <algorithm>
  2. fill(vec.begin(), vec.end(), val); //原來容器中每個元素被重置為val
fill_n函式的作用是:引數包括 : 一個迭代器,一個計數器以及一個值。該函式從迭代器指向的元素開始,將指定數量的元素設定為給定的值。
注意: 不能在沒有元素的空容器上呼叫fill_n函式,但是可以通過下面的方法改進。
  1. fill_n(vec.begin, 10, val);  

fill與memset的不同

它的原理是把那一塊單元賦成指定的值,與memset不同,memset是按位元組填充的。

例如:

#include<iostream>
using namespace std;
int main()
{
         int  d[100];
         fill(d,d+100,1);
         for(int i=0;i<100;i++)
          cout<<d[i]<<" ";
       cout<<endl;
         memset(d,1,100*sizeof(int));
        for(int i=0;i<100;i++)
        cout<<d[i]<<" ";
        cout<<endl;
        
       system("pause");
}
執行結果如下:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009
所以不難看出memset int 單元為1 時相當於
(1<<24)+(1<<16)+(1<<8)+1  =  16843009;

為了保證演算法有足夠的元素儲存輸出資料,我們使用“插入迭代器”(insert iterator),插入迭代器是可以給基礎容器新增元素的迭代器。

使用 back_inserter 的程式需要包含標頭檔案#include<iterator>,將上面的程式改寫成:

  1. #include <iterator>
  2. vector<int> vec; //定義一個空容器
  3. fill_n (back_inserter(vec), 10 val);  

在這個程式中,fill_n() 函式每寫入一個值,都會通過back_inserter生產的插入迭代器實現。效果相當於在vec上呼叫push_back,在vec末尾新增10個元素。