C++ STL算法系列6---copy函數


 

現在我們來看看變易算法。所謂變易算法(Mutating algorithms)就是一組能夠修改容器元素數據的模板函數,可進行序列數據的復制,變換等。

我們現在來看看第一個變易算法:元素復制算法copy。該算法主要用於容器之間元素的拷貝,即將迭代器區間[first,last)的元素復制到由復制目 標result給定的區間[result,result+(last-first))中。下面我們來看看它的函數原型:

1     template<class InputIterator, class OutputIterator>  
2        OutputIterator copy(  
3           InputIterator _First,   
4           InputIterator _Last,   
5           OutputIterator _DestBeg  
6        );  

參數

_First, _Last
指出被復制的元素的區間范圍[ _First,_Last).
_DestBeg 
指出復制到的目標區間起始位置

返回值

返回一個迭代器,指出已被復制元素區間的最后一個位置

程序示例:

首先我們來一個簡單的示例,定義一個簡單的整形數組myints,將其所有元素復制到容器myvector中,並將數組向左移動一位。

 1 #include <iostream>  
 2 #include <algorithm>  
 3 #include <vector>  
 4   
 5 using namespace std;  
 6   
 7 int main ()   
 8 {  
 9     int myints[] = {10, 20, 30, 40, 50, 60, 70};  
10     vector<int> myvector;  
11     vector<int>::iterator it;  
12       
13     myvector.resize(7);   // 為容器myvector分配空間  
14       
15     //copy用法一:  
16     //將數組myints中的七個元素復制到myvector容器中  
17     copy ( myints, myints+7, myvector.begin() );  
18       
19     cout << "myvector contains: ";  
20     for ( it = myvector.begin();  it != myvector.end();  ++it )  
21     {  
22         cout << " " << *it;  
23     }  
24     cout << endl;  
25   
26     //copy用法二:  
27     //將數組myints中的元素向左移動一位  
28     copy(myints + 1, myints + 7, myints);  
29   
30     cout << "myints contains: ";  
31     for ( size_t i = 0; i < 7; ++i )  
32     {  
33         cout << " " << myints[i];  
34     }  
35     cout << endl;  
36   
37     return 0;  
38 }  

從上例中我們看出copy算法可以很簡單地將一個容器里面的元素復制至另一個目標容器中,上例中代碼特別要注意一點就是myvector.resize(7);這行代碼,在這里一定要先為vector分配空間,否則程序會崩,這是初學者經常犯的一個錯誤。其實copy函數最大的威力是結合標准輸入輸出迭代器的時候,我們通過下面這個示例就可以看出它的威力了。

 1 #include <iostream>  
 2 #include <algorithm>  
 3 #include <vector>  
 4 #include <iterator>  
 5 #include <string>  
 6   
 7 using namespace std;  
 8   
 9 int main ()   
10 {  
11      typedef vector<int> IntVector;  
12      typedef istream_iterator<int> IstreamItr;  
13      typedef ostream_iterator<int> OstreamItr;  
14      typedef back_insert_iterator< IntVector > BackInsItr;  
15    
16      IntVector myvector;  
17   
18      // 從標准輸入設備讀入整數  
19      // 直到輸入的是非整型數據為止 請輸入整數序列,按任意非數字鍵並回車結束輸入  
20      cout << "Please input element:" << endl;  
21      copy(IstreamItr(cin), IstreamItr(), BackInsItr(myvector));  
22   
23      //輸出容器里的所有元素,元素之間用空格隔開  
24      cout << "Output : " << endl;  
25      copy(myvector.begin(), myvector.end(), OstreamItr(cout, " "));   
26      cout << endl;  
27   
28     return 0;  
29 }  

來源:http://blog.csdn.net/jerryjbiao/article/details/7376088


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM