C++ STL算法系列之十六:iter_swap

上文中闡述了元素交換算法swap以及容器中swap成員函數的使用,尤其是通過vector成員函數的交換技巧實現容器內存的收縮,今天,我們要看到的是另一個變易算法,迭代器的交換算法iter_swap,顧名思義,該算法是通過迭代器來完成元素的交換。首先我們來看看函數的原型:

函數原型:

  1. template<class ForwardIterator1, class ForwardIterator2>  
  2.    void iter_swap(  
  3.       ForwardIterator1 _Left,  
  4.       ForwardIterator2 _Right  
  5.    );  
參數說明:

        _Left,_Right指向要交換的兩個迭代器

程序示例:

        在泛型編程裏面,iterator被稱爲“泛型指針”,因此我們可以通過iterator作爲指針來交換兩個數組的元素,爲了展示swap和iter_swap的區別,在下面這個示例中,我們分別通過這兩個算法來實現數組元素的簡單交換。

  1. /******************************************************************* 
  2.  * Copyright (C) Jerry Jiang 
  3.  *                
  4.  * File Name   : iter_swap.cpp 
  5.  * Author      : Jerry Jiang 
  6.  * Create Time : 2012-3-26 23:22:18 
  7.  * Mail        : [email protected] 
  8.  * Blog        : http://blog.csdn.net/jerryjbiao  
  9.  *                
  10.  * Description : 簡單的程序詮釋C++ STL算法系列之十六                    
  11.  *               變易算法 : 迭代器交換iter_swap 
  12.  *                
  13.  ******************************************************************/  
  14.   
  15. #include <iostream>  
  16. #include <algorithm>  
  17. #include <iterator>  
  18.   
  19. using namespace std;  
  20. int main()  
  21. {  
  22.     //初始化數組  
  23.     int b[ 9 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
  24.     ostream_iterator< int > otpt( cout, " " );  
  25.       
  26.     //通過copy+ostream_iterator的方式輸出原始數組  
  27.     cout << "Array a contains:\n ";  
  28.     copy( b, b + 9, otpt );  
  29.   
  30.     //調用iter_swap交換b[0]和b[1]  
  31.     iter_swap( &b[0], &b[1] );  
  32.   
  33.     //調用swap交換b[2]和b[3],展示兩者的區別  
  34.     swap( b[2], b[3] );  
  35.   
  36.     //通過copy+ostream_iterator的方式輸出交換後的數組  
  37.     cout << "\n Array a after swapping :\n ";  
  38.     copy( b, b + 9, otpt );  
  39.     cout << endl;  
  40.   
  41.     return 0;  
  42. }  

上例中,迭代器是作爲泛型指針的形式來實現數組元素的交換,現在我們通過iter_swap算法來實現同一種容器之間元素的交換以及不同容器之間的元算交換。
  1. /******************************************************************* 
  2.  * Copyright (C) Jerry Jiang 
  3.  *                
  4.  * File Name   : iter_swap02.cpp 
  5.  * Author      : Jerry Jiang 
  6.  * Create Time : 2012-3-26 23:58:29 
  7.  * Mail        : [email protected] 
  8.  * Blog        : http://blog.csdn.net/jerryjbiao  
  9.  *                
  10.  * Description : 簡單的程序詮釋C++ STL算法系列之十六                    
  11.  *               變易算法 : 迭代器交換iter_swap 
  12.  * 
  13.  ******************************************************************/  
  14.   
  15. #include <vector>  
  16. #include <deque>  
  17. #include <algorithm>  
  18. #include <iostream>  
  19. #include <ostream>  
  20.   
  21. using namespace std;  
  22.   
  23. int main( )  
  24. {  
  25.    deque<int> deq1;  
  26.    deque<int>::iterator d1_Iter;  
  27.    ostream_iterator< int > otpt( cout, " " );  
  28.   
  29.    deq1.push_back ( 2 );  
  30.    deq1.push_back ( 4 );  
  31.    deq1.push_back ( 9 );  
  32.   
  33.    //通過copy輸出隊列初始序列  
  34.    cout << "The deque is:\n";  
  35.    copy(deq1.begin(), deq1.end(), otpt);  
  36.   
  37.    //通過iter_swap算法交換隊列中第一個和最後一個元素  
  38.    iter_swap(deq1.begin() , --deq1.end());  
  39.   
  40.    //輸出通過iter_swap交換後的隊列  
  41.    cout << "\n\nThe deque of CInts with first & last elements swapped is:\n ";  
  42.    copy(deq1.begin(), deq1.end(), otpt);  
  43.   
  44.    //通過swap交換算法還原隊列中的元素  
  45.    swap (*deq1.begin(), *(deq1.end()-1));  
  46.   
  47.    cout << "\n\nThe deque of CInts with first & last elements swapped back is:\n ";  
  48.    copy(deq1.begin(), deq1.end(), otpt);  
  49.    cout << endl;  
  50.      
  51.    cout << "*********************************" << endl;  
  52.   
  53.   
  54.    // 通過iter_swap交換vector和deque兩個不同容器中的元素  
  55.    vector <int> v1;  
  56.    deque <int> deq2;  
  57.   
  58.    //初始化容器v1  
  59.    for ( size_t i = 0 ; i <= 3 ; ++i )  
  60.    {  
  61.       v1.push_back( i );  
  62.    }  
  63.   
  64.    //初始化隊列deq2  
  65.    for ( size_t ii = 4 ; ii <= 5 ; ++ii )  
  66.    {  
  67.       deq2.push_back( ii );  
  68.    }  
  69.   
  70.    cout << "\nVector v1 is : " ;  
  71.    copy(v1.begin(), v1.end(), otpt);  
  72.      
  73.    cout << "\nDeque deq2 is : " ;  
  74.    copy(deq2.begin(), deq2.end(), otpt);  
  75.    cout << endl;  
  76.      
  77.    //交換容器v1和隊列deq2的第一個元素  
  78.    iter_swap( v1.begin(), deq2.begin() );  
  79.   
  80.    cout << "\n\nAfter exchanging first elements,\n vector v1 is:  " ;  
  81.    copy(v1.begin(), v1.end(), otpt);  
  82.   
  83.    cout << " \n deque deq2 is: ";  
  84.    copy(deq2.begin(), deq2.end(), otpt);  
  85.   
  86.    cout << endl;  
  87.   
  88.    return 0;  
  89. }  

*******************************************************************************************************************************

C++經典書目索引及資源下載:http://blog.csdn.net/jerryjbiao/article/details/7358796

********************************************************************************************************************************

發佈了8 篇原創文章 · 獲贊 32 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章