現在我們來看看變易算法。所謂變易算法(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 }

