編程第六十、六十一天

c++ copy()對不同容器複製;關於輸出區間與輸入區間重疊的討論

  1. #include <iostream>  
  2. #include <algorithm>  
  3. #include <deque>  
  4.   
  5. using namespace std;  
  6. template<class T>  
  7. struct display  
  8. {  
  9.     void operator()(const T &x)const  
  10.     {  
  11.         cout<<x<<" ";  
  12.     }  
  13. };  
  14.   
  15. int main()  
  16. {  
  17.     //以下複製區間沒有問題   
  18.     int ia1[]={0,1,2,3,4,5,6,7,8};  
  19.     copy(ia1+2,ia1+7,ia1);//將下標2-6複製給 1-5  
  20.     for_each(ia1,ia1+9,display<int>()); //2,3,4,5,6,5,6,7,8  
  21.     cout<<endl;  
  22.        
  23.     //輸出區間的起點與輸入區間重疊,可能會有問題。但本例copy採用memmove()執行實際複製操作   
  24.     int ia2[]={0,1,2,3,4,5,6,7,8};  
  25.     copy(ia2+2,ia2+7,ia2+4);//將下標2-6複製給 4-8  
  26.     for_each(ia2,ia2+9,display<int>()); //0,1,2,3,2,3,4,5,6  
  27.     cout<<endl;  
  28.       
  29.     //以下複製區間沒有問題   
  30.     int ia3[]={0,1,2,3,4,5,6,7,8};  
  31.     deque<int> id(ia3,ia3+9);  
  32.     deque<int>::iterator first=id.begin();  
  33.     deque<int>::iterator last=id.end();  
  34.     deque<int>::iterator result=id.begin();  
  35.     ++++first;  
  36.     cout<<*first<<endl;  
  37.     ----last;  
  38.     cout<<*last<<endl;  
  39.     cout<<*result<<endl;  
  40.     copy(first,last,result);  
  41.     for_each(id.begin(),id.end(),display<int>());//2,3,4,5,6,5,6,7,8  
  42.     cout<<endl;  
  43.       
  44.     //以下複製區間存在問題,由於實際複製沒有采用memove(),結果錯誤   
  45.     int ia4[]={0,1,2,3,4,5,6,7,8};  
  46.     deque<int> ide(ia4,ia4+9);  
  47.     deque<int>::iterator first1=ide.begin();  
  48.     deque<int>::iterator last1=ide.end();  
  49.     deque<int>::iterator result1=ide.begin();  
  50.     advance(result1,4);//注意這裏跟上面不一樣   
  51.     ++++first1;  
  52.     cout<<*first1<<endl;  
  53.     ----last1;  
  54.     cout<<*last1<<endl;  
  55.     cout<<*result1<<endl;  
  56.     copy(first1,last1,result1);  
  57.     for_each(ide.begin(),ide.end(),display<int>());// 0,1,2,3,2,3,2,3,2不是預期的 0,1,2,3,2,3,4,5,6  
  58.     cout<<endl;  
  59.       
  60.       
  61.       
  62.     return 0;  
  63. }   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章