zoukankan      html  css  js  c++  java
  • 第22章 变易算法

     

    第22章 变易算法  Modifying  sequence operations


       22.1 元素复制copy
    copy  Copy range of elements (function template)   
       22.2 反向复制copy_backward
    copy_backward  Copy range of elements backwards (function template)   
       22.3 元素交换swap
    swap  Exchange values of two objects (function template)   
       22.4 迭代器交换iter_swap
    iter_swap  Exchange values of objects pointed by two iterators (function template)   
       22.5 区间元素交换swap_ranges
    swap_ranges  Exchange values of two ranges (function template)   
       22.6 元素变换transform
    transform  Apply function to range (function template)   
       22.7 替换Replace
    replace  Replace value in range (function template)   
       22.8 条件替换replace_if
    replace_if  Replace values in range (function template)   
       22.9 替换和复制replace_copy
    replace_copy  Copy range replacing value (function template)   
       22.10 条件替换和复制replace_copy_if
    replace_copy_if  Copy range replacing value (function template)   
       22.11 填充fill
    fill  Fill range with value (function template)   
       22.12 n次填充fill_n
    fill_n  Fill sequence with value (function template)   
       22.13 随机生成元素generate
    generate  Generate values for range with function (function template)   
       22.14 随机生成n个元素generate_n
    generate_n  Generate values for sequence with function (function template)   
       22.15 移除复制remove_copy
    remove_copy  Copy range removing value (function template)
       22.16 条件移除复制remove_copy_if
    remove_copy_if  Copy range removing values (function template)
       22.17 移除remove
    remove  Remove value from range (function template)
       22.18 条件移除remove_if
    remove_if  Remove elements from range (function template)
       22.19 不连续重复元素复制unique_copy
    unique_copy  Copy range removing duplicates (function template)
       22.20 剔除连续重复元素unique
    unique  Remove consecutive duplicates in range (function template)
       22.21 元素反向reverse
    reverse  Reverse range (function template)
       22.22 反向复制reverse_copy
    reverse_copy  Copy range reversed (function template)
       22.23 旋转rotate
    rotate  Rotate elements in range (function template)
       22.24 旋转复制rotate_copy
    rotate_copy  Copy rotated range (function template)
       22.25 随机抖动random_shuffle
    random_shuffle  Rearrangle elements in range randomly (function template)   
       22.26 随机采样random_sample
    ...
       22.27 容器分割partition
    partition  Partition range in two (function template)   
       22.28 容器稳定分割stable_partition
    stable_partition  Divide range in two groups - stable ordering (function template)   
       22.29 本章小结

     

    /*
    
      第22章 变易算法
       22.1 元素复制copy
       22.2 反向复制copy_backward
       22.3 元素交换swap
       22.4 迭代器交换iter_swap
       22.5 区间元素交换swap_ranges
       22.6 元素变换transform
       22.7 替换Replace
       22.8 条件替换replace_if
       22.9 替换和复制replace_copy
       22.10 条件替换和复制replace_copy_if
       22.11 填充fill
       22.12 n次填充fill_n
       22.13 随机生成元素generate
       22.14 随机生成n个元素generate_n
       22.15 移除复制remove_copy
       22.16 条件移除复制remove_copy_if
       22.17 移除remove
       22.18 条件移除remove_if
       22.19 不连续重复元素复制unique_copy
       22.20 剔除连续重复元素unique
       22.21 元素反向reverse
       22.22 反向复制reverse_copy
       22.23 旋转rotate
       22.24 旋转复制rotate_copy
       22.25 随机抖动random_shuffle
       22.26 随机采样random_sample
       22.27 容器分割partition
       22.28 容器稳定分割stable_partition
       22.29 本章小结
    
    
    
      第22章 变易算法
    Modifying  sequence operations:  
       22.1 元素复制copy
    copy  Copy range of elements (function template)   
       22.2 反向复制copy_backward
    copy_backward  Copy range of elements backwards (function template)   
       22.3 元素交换swap
    swap  Exchange values of two objects (function template)   
       22.4 迭代器交换iter_swap
    iter_swap  Exchange values of objects pointed by two iterators (function template)   
       22.5 区间元素交换swap_ranges
    swap_ranges  Exchange values of two ranges (function template)   
       22.6 元素变换transform
    transform  Apply function to range (function template)   
       22.7 替换Replace
    replace  Replace value in range (function template)   
       22.8 条件替换replace_if
    replace_if  Replace values in range (function template)   
       22.9 替换和复制replace_copy
    replace_copy  Copy range replacing value (function template)   
       22.10 条件替换和复制replace_copy_if
    replace_copy_if  Copy range replacing value (function template)   
       22.11 填充fill
    fill  Fill range with value (function template)   
       22.12 n次填充fill_n
    fill_n  Fill sequence with value (function template)   
       22.13 随机生成元素generate
    generate  Generate values for range with function (function template)   
       22.14 随机生成n个元素generate_n
    generate_n  Generate values for sequence with function (function template)   
       22.15 移除复制remove_copy
    remove_copy  Copy range removing value (function template)
       22.16 条件移除复制remove_copy_if
    remove_copy_if  Copy range removing values (function template)
       22.17 移除remove
    remove  Remove value from range (function template)
       22.18 条件移除remove_if
    remove_if  Remove elements from range (function template)
       22.19 不连续重复元素复制unique_copy
    unique_copy  Copy range removing duplicates (function template)
       22.20 剔除连续重复元素unique
    unique  Remove consecutive duplicates in range (function template)
       22.21 元素反向reverse
    reverse  Reverse range (function template)
       22.22 反向复制reverse_copy
    reverse_copy  Copy range reversed (function template)
       22.23 旋转rotate
    rotate  Rotate elements in range (function template)
       22.24 旋转复制rotate_copy
    rotate_copy  Copy rotated range (function template)
       22.25 随机抖动random_shuffle
    random_shuffle  Rearrangle elements in range randomly (function template)   
       22.26 随机采样random_sample
    ...
       22.27 容器分割partition
    partition  Partition range in two (function template)   
       22.28 容器稳定分割stable_partition
    stable_partition  Divide range in two groups - stable ordering (function template)   
       22.29 本章小结
    
    
    
    */
    View Code

     

      第22章 变易算法
    Modifying  sequence operations: 
       22.1 元素复制copy
    copy  Copy range of elements (function template)  

    //  第22章 变易算法
    
    //   22.1 元素复制copy ---------------------------------------------------
    
    template<class InputIterator, class OutputIterator>
      OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result )
    {
      while (first!=last) *result++ = *first++;
      return result;
    }
    
    // 把序列一中某范围内的元素,复制到序列二中去。前两个参数是序列一范围,第三个参数是序列二的开始位置
    // 当序列二不够大时,不够装部分将复制不过去。
    
    
    // copy algorithm example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int main () {
      int myints[]={10,20,30,40,50,60,70};
      vector<int> myvector;
      vector<int>::iterator it;
    
      myvector.resize(7);   // allocate space for 7 elements
                            // 如7改成5,将只复制前5个元素
      copy ( myints, myints+7, myvector.begin() );
    
      cout << "myvector contains:";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
    
      return 0;
    }
    
    
    // 304
    #include <algorithm>
    #include <vector>
    #include <list>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << "  ";
    }
    int main(void)
    {
      //初始化向量v
      vector < int > v;
      v.push_back(1);
      v.push_back(3);
      v.push_back(5);
      //初始化双向链表l
      list < int > l;
      l.push_back(2);
      l.push_back(4);
      l.push_back(6);
      l.push_back(8);
      l.push_back(10);
      //复制v到l
      copy(v.begin(), v.end(), l.begin());
      //链表l打印l 3 5 8 10
      for_each(l.begin(), l.end(), print);
      cout << endl;
      return 0;
    }


       22.2 反向复制copy_backward
    copy_backward  Copy range of elements backwards (function template)  

    //   22.2 反向复制copy_backward ---------------------------------------------------
    
    template<class BidirectionalIterator1, class BidirectionalIterator2>
      BidirectionalIterator2 copy_backward ( BidirectionalIterator1 first,
                                             BidirectionalIterator1 last,
                                             BidirectionalIterator2 result )
    {
      while (last!=first) *(--result) = *(--last);
      return result;
    }
    
    // 把序列一中某范围内的元素,复制到序列二中去。前两个参数是序列一范围,第三个参数是序列二的结束位置的下一个位置。
    // 两序列可以是同一序列
    
    // copy_backward example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int main () {
      vector<int> myvector;
      vector<int>::iterator it;
    
      // set some values:
      for (int i=1; i<=5; i++)
        myvector.push_back(i*10);          // myvector: 10 20 30 40 50
    
      myvector.resize(myvector.size()+3);  // allocate space for 3 more elements
    
      copy_backward ( myvector.begin(), myvector.begin()+5, myvector.end() );
    
      cout << "myvector contains:";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
    
      return 0;
    }
    
    
    //306 始终是左闭右开区间操作
    #include <algorithm>
    #include <vector>
    #include <iostream>
    using namespace std;
    
    void print(int x)
    {
      cout << x << ' ';
    }
    
    int main(void)
    {
      vector < int > v(10);
      for(unsigned int i = 0; i < v.size(); i++)
        v[i] = i + 1;  // 1 2 3 4 5 6 7 8 9 10
      copy_backward(v.begin(), v.begin() + 3, v.end());
      for_each(v.begin(), v.end(), print);
      cout << endl;    // 1 2 3 4 5 6 7 1 2 3
      return 0;
    }


       22.3 元素交换swap
    swap  Exchange values of two objects (function template)  

    //   22.3 元素交换swap ---------------------------------------------------
    
    template <class T> void swap ( T& a, T& b )
    {
      T c(a); a=b; b=c;
    }
    // 不通过指针交换两个元素
    
    
    // swap algorithm example。只要是同一类型的,统统交换
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int main () {
    
      int x=10, y=20;                         // x:10 y:20
      swap(x,y);                              // x:20 y:10
    
      vector<int> first (4,x), second (6,y);  // first:4x20 second:6x10
      swap(first,second);                     // first:6x10 second:4x20
    
      cout << "first contains:";
      for (vector<int>::iterator it=first.begin(); it!=first.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
    
      return 0;
    }
    
    
    
    //307
    #include <algorithm>
    #include <iostream>
    int main(void)
    {
      using namespace std;
      int a = 5;
      int b = 26;
      cout << "交换前 " << "a = " << a << " b = " << b << endl;
      swap(a, b);
      cout << "交换后 " << "a = " << a << " b = " << b << endl;
      return 0;
    }


       22.4 迭代器交换iter_swap
    iter_swap  Exchange values of objects pointed by two iterators (function template)  

    //   22.4 迭代器交换iter_swap ---------------------------------------------------
    
    template <class ForwardIterator1, class ForwardIterator2>
      void iter_swap ( ForwardIterator1 a, ForwardIterator2 b )
    {
      swap (*a, *b);
    }
    // 利用指针(迭代器)交换值
    
    
    
    // iter_swap example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int main () {
    
      int myints[]={10,20,30,40,50 };          //   myints:  10  20  30  40  50
      vector<int> myvector (4,99);             // myvector:  99  99  99  99
    
      iter_swap(myints,myvector.begin());      //   myints: [99] 20  30  40  50
                                               // myvector: [10] 99  99  99
    
      iter_swap(myints+3,myvector.begin()+2);  //   myints:  99  20  30 [99]
                                               // myvector:  10  99 [40] 99
    
      cout << "myvector contains:";
      for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
    
      return 0;
    }
    
    
    // 307
    #include <algorithm>
    #include <iostream>
    int main(void)
    {
      using namespace std;
      int a = 5;
      int b = 26;
      cout << "交换前 " << "a = " << a << " b = " << b << endl;
      iter_swap(&a, &b);
      cout << "交换后 " << "a = " << a << " b = " << b << endl;
      return 0;
    }


       22.5 区间元素交换swap_ranges
    swap_ranges  Exchange values of two ranges (function template)  

    //   22.5 区间元素交换swap_ranges ---------------------------------------------------
    
    template<class ForwardIterator1, class ForwardIterator2>
      ForwardIterator2 swap_ranges ( ForwardIterator1 first1, ForwardIterator1 last1,
                                     ForwardIterator2 first2 )
    {
      while (first1!=last1) swap(*first1++, *first2++);
      return first2;
    }
    // 两个区间中的元素分别交换。只有三个参数,第四个参数又省了
    // 注意:第二个序列要足够长,否则会出现异常,见下面第二个程序。
    
    
    // swap_ranges example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int main () {
      vector<int> first (5,10);        //  first: 10 10 10 10 10
      vector<int> second (5,33);       // second: 33 33 33 33 33
      vector<int>::iterator it;
    
      swap_ranges(first.begin()+1, first.end()-1, second.begin());
    
      // print out results of swap:
      cout << " first contains:";
      for (it=first.begin(); it!=first.end(); ++it)
        cout << " " << *it;
    
      cout << "
    second contains:";
      for (it=second.begin(); it!=second.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
    
      return 0;
    }
    
    
    
    // swap_ranges example. my test:请观察输出结果,当第二个序列不够长时,交换到第一个序列的,不是希望的值!
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int main () {
      vector<int> first (5,10);        //  first: 10 10 10 10 10
      vector<int> second (2,33);       // second: 33 33
      vector<int>::iterator it;
    
      swap_ranges(first.begin()+1, first.end()-1, second.begin());
    
      // print out results of swap:
      cout << " first contains:";
      for (it=first.begin(); it!=first.end(); ++it)
        cout << " " << *it;
    
      cout << "
    second contains:";
      for (it=second.begin(); it!=second.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
    
      return 0;
    }
    
    
    //308
    #include <algorithm>
    #include <vector>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << " ";
    }
    
    int main(void)
    {
      vector < int > v1, v2;
      v1.push_back(1);
      v1.push_back(3);
      v1.push_back(5);
      v2.push_back(2);
      v2.push_back(4);
      v2.push_back(6);
      //打印v1、v2
      cout << "交换前, v1=";
      for_each(v1.begin(), v1.end(), print);
      cout << "v2=";
      for_each(v2.begin(), v2.end(), print);
      cout << endl;
      //交换v1、v2
      swap_ranges(v1.begin(), v1.end(), v2.begin());
      //打印v1、v2
      cout << "交换后, v1=";
      for_each(v1.begin(), v1.end(), print);
      cout << "v2=";
      for_each(v2.begin(), v2.end(), print);
      cout << endl;
      return 0;
    }


       22.6 元素变换transform
    transform  Apply function to range (function template)  

    //   22.6 元素变换transform ---------------------------------------------------
    
    template < class InputIterator, class OutputIterator, class UnaryOperator >
      OutputIterator transform ( InputIterator first1, InputIterator last1,
                                 OutputIterator result, UnaryOperator op )
    {
      while (first1 != last1)
        *result++ = op(*first1++);  // or: *result++=binary_op(*first1++,*first2++);
      return result;
    }
    // 加转换的copy。而且转换函数可以是一元的,也可以是二元的。
    // 一元的参数有四个:开始两个表示第一序列范围,第三个是结果存放开始位置,第四个是一元函数(对象)
    // 二元的参数有五个:开始两个表示第一序列范围,第三个是第二序列开始位置,第四个是结果存放开始位置,第五个是二元函数(对象)
    
    
    
    // transform algorithm example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int op_increase (int i) { return ++i; }
    int op_sum (int i, int j) { return i+j; }
    
    int main () {
      vector<int> first;
      vector<int> second;
      vector<int>::iterator it;
    
      // set some values:
      for (int i=1; i<6; i++) first.push_back (i*10); //  first: 10 20 30 40 50
    
      second.resize(first.size());     // allocate space
      transform (first.begin(), first.end(), second.begin(), op_increase); // 四个参数
                                                      // second: 11 21 31 41 51
    
      transform (first.begin(), first.end(), second.begin(), first.begin(), op_sum); // 五个参数
                                                      //  first: 21 41 61 81 101
    
      cout << "first contains:";
      for (it=first.begin(); it!=first.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
      return 0;
    }
    
    
    // 309
    #include <algorithm>
    #include <vector>
    #include <list>
    #include <iostream>
    using namespace std;
    int square(int x)
    {
      return x *x;
    }
    void print(int x)
    {
      cout << x << "  ";
    }
    int main(void)
    {
      //vector初始化    
      vector < int > v;
      v.push_back(5);
      v.push_back(15);
      v.push_back(25);
      //list初始化
      list < int > l(3);
      //对vector容器元素执行平方运算,放入list容器
      transform(v.begin(), v.end(), l.begin(), square);
      //打印链表元素
      for_each(l.begin(), l.end(), print);
      cout << endl;
      return 0;
    }


       22.7 替换Replace
    replace  Replace value in range (function template)  

    //   22.7 替换 ---------------------------------------------------
    
    
    template < class ForwardIterator, class T >
      void replace ( ForwardIterator first, ForwardIterator last,
                     const T& old_value, const T& new_value )
    {
      for (; first != last; ++first)
        if (*first == old_value) *first=new_value;
    }
    // 在指定范围内旧值换新值
    
    
    
    
    // replace algorithm example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int main () {
      int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
      vector<int> myvector (myints, myints+8);            // 10 20 30 30 20 10 10 20
    
      replace (myvector.begin(), myvector.end(), 20, 99); // 10 99 30 30 99 10 10 99
    
      cout << "myvector contains:";
      for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
     
      return 0;
    }
    
    
    //311
    #include <algorithm>
    #include <vector>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << "  ";
    }
    int main(void)
    {
      vector < int > v;
      v.push_back(13);
      v.push_back(25);
      v.push_back(27);
      v.push_back(25);
      v.push_back(29);
      //将v的25全部替换为100
      replace(v.begin(), v.end(), 25, 100);
      cout << "v向量元素: ";
      for_each(v.begin(), v.end(), print);
      cout << endl;
      //将iArray的5全部替换为200
      int iArray[7] = {3, 6, 5, 9, 5, 5, 10};
      replace(iArray, iArray + 7, 5, 200);
      cout << "数组iArray元素: ";
      for_each(iArray, iArray + 7, print);
      cout << endl;
      return 0;
    }


       22.8 条件替换replace_if
    replace_if  Replace values in range (function template)  

    //   22.8 条件替换replace_if ---------------------------------------------------
    
    
    template < class ForwardIterator, class Predicate, class T >
      void replace_if ( ForwardIterator first, ForwardIterator last,
                        Predicate pred, const T& new_value )
    {
      for (; first != last; ++first)
        if (pred(*first)) *first=new_value;
    }
    // 当元素满足什么条件时,更新为新值
    
    
    
    // replace_if example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    bool IsOdd (int i) { return ((i%2)==1); }
    
    int main () {
      vector<int> myvector;
      vector<int>::iterator it;
    
      // set some values:
      for (int i=1; i<10; i++) myvector.push_back(i);          // 1 2 3 4 5 6 7 8 9
      
      replace_if (myvector.begin(), myvector.end(), IsOdd, 0); // 0 2 0 4 0 6 0 8 0
                                                               // 把奇数都替换为0
      cout << "myvector contains:";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
     
      return 0;
    }
    
    
    
    // 312
    
    #include <algorithm>
    #include <vector>
    #include <iostream>
    bool odd(int x)
    {
      return x % 2;
    }
    int main(void)
    {
      using namespace std;
      vector < int > v(10);
      unsigned int i;
      for(i = 0; i < v.size(); i++)
      {
        v[i] = i % 7;
        cout << v[i] << ' ';
      }
      cout << endl;
      //将奇数元素替换为38
      replace_if(v.begin(), v.end(), odd, 38);
      for(i = 0; i < v.size(); i++)
        cout << v[i] << ' ';
      cout << endl;
      return 0;
    }


       22.9 替换和复制replace_copy
    replace_copy  Copy range replacing value (function template)  

    //   22.9 替换和复制replace_copy ---------------------------------------------------
    
    
    template < class InputIterator, class OutputIterator, class T >
      OutputIterator replace_copy ( InputIterator first, InputIterator last,
                                    OutputIterator result, const T& old_value, const T& new_value )
    {
      for (; first != last; ++first, ++result)
        *result = (*first==old_value)? new_value: *first;
      return result;
    }
    // 将第一序列某范围内的元素,复制到第二序列中去。在这个复制过程中,将旧值,替换为新值
    // 前两个参数表示第一序列范围,第三个参数为第二序列开始位置(木有结束位置),第四、五个参数为旧、新值
    
    
    // replace_copy example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int main () {
      int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
    
      vector<int> myvector (8);
      replace_copy (myints, myints+8, myvector.begin(), 20, 99);
    
      cout << "myvector contains:";
      for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
     
      return 0;
    }
    
    
    // 313
    #include <algorithm>
    #include <list>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << ' ';
    }
    int main(void)
    {
      list < int > l1;
      l1.push_back(1);
      l1.push_back(3);
      l1.push_back(1);
      l1.push_back(6);
      l1.push_back(8);
      //将l1链表元素1替换为100,然后拷贝到l2链表
      list < int > l2(5);
      replace_copy(l1.begin(), l1.end(), l2.begin(), 1, 100);
      cout << "l1保持不变: ";
      for_each(l1.begin(), l1.end(), print);
      cout << "
    l2元素为: ";
      for_each(l2.begin(), l2.end(), print);
      cout << endl;
      return 0;
    }


       22.10 条件替换和复制replace_copy_if
    replace_copy_if  Copy range replacing value (function template)  

    //   22.10 条件替换和复制replace_copy_if ---------------------------------------------------
    
    
    template < class InputIterator, class OutputIterator, class Predicate, class T >
      OutputIterator replace_copy_if ( InputIterator first, InputIterator last,
                                       OutputIterator result, Predicate pred,
                                       const T& new_value )
    {
      for (; first != last; ++first, ++result)
        *result = (pred(*first))? new_value: *first;
      return result;
    }
    // replace_copy的谓词判断版本。 木有旧值了,替换为一个谓词。这样应用范围更广
    
    
    
    // replace_copy_if example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    bool IsOdd (int i) { return ((i%2)==1); }
    
    int main () {
      vector<int> first,second;
      vector<int>::iterator it;
    
      // set some values:
      for (int i=1; i<10; i++) first.push_back(i);          // 1 2 3 4 5 6 7 8 9
    
      second.resize(first.size());   // allocate space
      replace_copy_if (first.begin(), first.end(), second.begin(), IsOdd, 0);
                                                            // 0 2 0 4 0 6 0 8 0
    
      cout << "second contains:";
      for (it=second.begin(); it!=second.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
     
      return 0;
    }
    
    
    // 314
    #include <algorithm>
    #include <vector>
    #include <list>
    #include <iostream>
    using namespace std;
    
    bool odd(int x)
    {
      return x % 2;
    }
    
    int main(void)
    {
      using namespace std;
      vector < int > v(10);
      unsigned int i;
      for(i = 0; i < v.size(); i++)
      {
        v[i] = i % 7;
        cout << v[i] << ' ';
      }
      cout << endl;
      //将向量v中奇数元素替换为38后,拷贝到链表l
      list < int > l(10);
      replace_copy_if(v.begin(), v.end(), l.begin(), odd, 38);
      list < int > ::iterator list_iter;
      for(list_iter = l.begin(); list_iter != l.end(); list_iter++)
        cout <<  *list_iter << ' ';
      cout << endl;
      return 0;
    }


       22.11 填充fill
    fill  Fill range with value (function template)  

    //   22.11 填充fill ---------------------------------------------------
    
    
    template < class ForwardIterator, class T >
      void fill ( ForwardIterator first, ForwardIterator last, const T& value )
    {
      while (first != last)  *first++ = value;
    }
    // 在序列范围内,均填充上某新值。
    
    
    // fill algorithm example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int main () {
      vector<int> myvector (8);                       // myvector: 0 0 0 0 0 0 0 0
    
      fill (myvector.begin(),myvector.begin()+4,5);   // myvector: 5 5 5 5 0 0 0 0
      fill (myvector.begin()+3,myvector.end()-2,8);   // myvector: 5 5 5 8 8 8 0 0
    
      cout << "myvector contains:";
      for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
     
      return 0;
    }
    
    
    //315
    #include <algorithm>
    #include <vector>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << ' ';
    }
    int main(void)
    {
      vector < int > v(5);
      fill(v.begin(), v.end(), 30);
      for_each(v.begin(), v.end(), print);
      cout << endl;
      return 0;
    }


       22.12 n次填充fill_n
    fill_n  Fill sequence with value (function template)  

    //   22.12 n次填充fill_n ---------------------------------------------------
    
    
    template < class OutputIterator, class Size, class T >
      void fill_n ( OutputIterator first, Size n, const T& value )
    {
      for (; n>0; --n)  *first++ = value;
    }
    // 在起始位置开始,填充n个value。三个参数:起始位置、几个、新值。
    
    
    
    // fill_n example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int main () {
      vector<int> myvector (8,10);        // myvector: 10 10 10 10 10 10 10 10
    
      fill_n (myvector.begin(),4,20);     // myvector: 20 20 20 20 10 10 10 10
      fill_n (myvector.begin()+3,3,33);   // myvector: 20 20 20 33 33 33 10 10
    
      cout << "myvector contains:";
      for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
     
      return 0;
    }
    
    
    //315
    #include <algorithm>
    #include <vector>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << ' ';
    }
    int main(void)
    {
      vector < int > v(8);
      fill(v.begin(), v.end(), 1);
      //前5个元素填充为2
      fill_n(v.begin(), 5, 2);
      for_each(v.begin(), v.end(), print);
      cout << endl;
      //全部填充为3
      fill_n(v.begin(), v.size(), 3);
      for_each(v.begin(), v.end(), print);
      cout << endl;
      return 0;
    }


       22.13 随机生成元素generate
    generate  Generate values for range with function (function template)  

    //   22.13 随机生成元素generate ---------------------------------------------------
    
    
    
    template <class ForwardIterator, class Generator>
      void generate ( ForwardIterator first, ForwardIterator last, Generator gen )
    {
      while (first != last)  *first++ = gen();
    }
    // 在指定范围内,填充上第三个参数gen产生的值。
    // gen是个函数(对象),木有参数。所以产生的值,纯粹取决于gen,与容器原来的元素无关
    
    
    
    // generate algorithm example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <ctime>
    #include <cstdlib>
    using namespace std;
    
    // function generator:
    int RandomNumber () { return (rand()%100); } // 产生一百以内的随机数
    
    // class generator:
    struct c_unique {
      int current;
      c_unique() {current=0;} // 构造函数,设成员current初始值为0
      int operator()() {return ++current;} // 调用操作符()重载,使此类能产生函数对象
    } UniqueNumber;
    
    
    int main () {
      srand ( unsigned ( time(NULL) ) );
    
      vector<int> myvector (8);
      vector<int>::iterator it;
    
      generate (myvector.begin(), myvector.end(), RandomNumber);
    
      cout << "myvector contains:";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      generate (myvector.begin(), myvector.end(), UniqueNumber);
    
      cout << "
    myvector contains:";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
     
      return 0;
    }
    
    
    //316
    #include <algorithm>
    #include <vector>
    #include <iostream>
    using namespace std;
    //等差数列an+1=an + 3
    class sequence
    {
      public:
        int a;
        sequence(){ a = 0; } // 构造函数
        inline int operator()() // 重载()
        {
            //a = a + 3;
            //return a;
            return a+=3;
        }
    };
    void print(int x)
    {
      cout << x << endl;
    }
    
    int main(void)
    {
      vector < int > v(10);
      sequence an;
      generate(v.begin(), v.end(), an);
      for_each(v.begin(), v.end(), print);
      cout << endl;
      return 0;
    }


       22.14 随机生成n个元素generate_n
    generate_n  Generate values for sequence with function (function template)  

    //   22.14 随机生成n个元素generate_n ---------------------------------------------------
    
    
    template <class OutputIterator, class Size, class Generator>
      void generate ( OutputIterator first, Size n, Generator gen )
    {
      for (; n>0; --n)  *first++ = gen();
    }
    // 在开始位置之后,填充n个gen()产生的值。三个参数:起始位置、几个、gen产生的值。
    
    
    
    // generate_n example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int current(0);
    int UniqueNumber () { return ++current; }
    
    int main () {
      vector<int> myvector (9);
      vector<int>::iterator it;
    
      generate_n (myvector.begin(), 6, UniqueNumber); // 因为产生6个,后面几个仍是0
    
      cout << "myvector contains:";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
     
      return 0;
    }
    
    
    //317
    #include <algorithm>
    #include <vector>
    #include <iostream>
    int main(void)
    {
      using namespace std;
      vector < int > v(10);
      //生成3个伪随机数
      generate_n(v.begin(), 3, rand);
      for(unsigned int i = 0; i < v.size(); i++)
        cout << v[i] << ' ';
      cout << endl;
      return 0;
    }


       22.15 移除复制remove_copy
    remove_copy  Copy range removing value (function template)

    //   22.15 移除复制remove_copy ---------------------------------------------------
    
    template <class InputIterator, class OutputIterator, class T>
      OutputIterator remove_copy ( InputIterator first, InputIterator last,
                                   OutputIterator result, const T& value )
    {
      for ( ; first != last; ++first)
        if (!(*first == value)) *result++ = *first;
      return result;
    }
    // 将容器中,不等于某值的元素,复制到另一容器中。
    // 参数有四个:前两个表示范围,第三个是另一容器的起始位置,第四个是某值。
    // 这样就产生了一个问题,另一容器,可以是同一容器么?可以的,请看下面第二个my test程序。
    
    
    
    // remove_copy example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int main () {
      int myints[] = {10,20,30,30,20,10,10,20};          // 10 20 30 30 20 10 10 20
      vector<int> myvector (8);  // 如改成2,可以看到,容器不会自动扩充,只会复制进2个数。
      vector<int>::iterator it;
    
      remove_copy (myints,myints+8,myvector.begin(),20); // 10 30 30 10 10 0 0 0
    
      cout << "myvector contains:";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
     
      return 0;
    }
    
    
    
    // remove_copy example。my test: 同一容器是可以的。
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int main () {
      int myints[] = {10,20,30,30,20,10,10,20};          // 10 20 30 30 20 10 10 20
      vector<int> myvector (myints,myints+8);
      vector<int>::iterator it;
                                                         // 10 30 30 10 10 [10 10 20
      remove_copy (myvector.begin(),myvector.end(),myvector.begin(),20); // 最后三个是原来的
    
    
      cout << "myvector contains:";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
     
      return 0;
    }
    
    
    //318
    #include <algorithm>
    #include <vector>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << "  ";
    }
    int main(void)
    {
      vector < int > v;
      v.push_back(2);
      v.push_back(4);
      v.push_back(3);
      v.push_back(4);
      v.push_back(8);
      //
      int iArray[6]={0};
      //
      remove_copy(v.begin(), v.end(), iArray, 4);
      for_each(v.begin(), v.end(), print);
      cout << endl;
      //
      for_each(iArray, iArray + 6, print);
      cout << endl;
      return 0;
    }


       22.16 条件移除复制remove_copy_if
    remove_copy_if  Copy range removing values (function template)

    //   22.16 条件移除复制remove_copy_if ---------------------------------------------------
    
    
    template <class InputIterator, class OutputIterator, class Predicate>
      OutputIterator remove_copy_if ( InputIterator first, InputIterator last,
                                      OutputIterator result, Predicate pred )
    {
      for ( ; first != last; ++first)
        if (!pred(*first)) *result++ = *first;
      return result;
    }
    // remove_copy 的带谓词判断的版本。把第四个参数,改成了函数(对象)。
    
    
    
    // remove_copy_if example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    bool IsOdd (int i) { return ((i%2)==1); }
    
    int main () {
      int myints[] = {1,2,3,4,5,6,7,8,9};          
      vector<int> myvector (9);
      vector<int>::iterator it;
    
      remove_copy_if (myints,myints+9,myvector.begin(),IsOdd); // 是奇数的,被删除
    
      cout << "myvector contains:";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
     
      return 0;
    }
    
    
    // 319
    #include <algorithm>
    #include <vector>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << "  ";
    }
    bool even(int x)
    {
      //偶数
      return x % 2 ? 0 : 1;
    }
    int main(void)
    {
      //初始化向量v
      vector < int > v;
      v.push_back(7);
      v.push_back(2);
      v.push_back(5);
      v.push_back(4);
      v.push_back(1);
      //初始化数组iArray
      int iArray[6] = {0};
      //移除v中偶数,剩余元素复制到iArray
      remove_copy_if(v.begin(), v.end(), iArray, even);
      //打印v,v没有改变
      for_each(v.begin(), v.end(), print);
      cout << endl;
      //打印iArray
      for_each(iArray, iArray + 6, print);
      cout << endl;
      return 0;
    }


       22.17 移除remove
    remove  Remove value from range (function template)

    //   22.17 移除remove ---------------------------------------------------
    
    
    template < class ForwardIterator, class T >
      ForwardIterator remove ( ForwardIterator first, ForwardIterator last, const T& value )
    {
      ForwardIterator result = first;
      for ( ; first != last; ++first)
        if (!(*first == value)) *result++ = *first;
      return result;
    }
    // 将容器中等于某值的元素删除。
    // 因为在同一容器中操作,所以返回值值得关注。返回排列完删除某些元素之后的序列的后一个位置。
    // 如果要将数据复制到另一容器,可以考虑用remove_copy
    
    
    // remove algorithm example
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int main () {
      int myints[] = {10,20,30,30,20,10,10,20};      // 10 20 30 30 20 10 10 20
    
      // bounds of range:
      int* pbegin = myints;                          // ^
      int* pend = myints+sizeof(myints)/sizeof(int); // ^                       ^
    
      pend = remove (pbegin, pend, 20);              // 10 30 30 10 10 10 10 20
                                                     // ^              ^
      cout << "range contains:";
      for (int* p=pbegin; p!=pend; ++p)
        cout << " " << *p;
    
      cout << endl;
     
      return 0;
    }
    
    
    
    // 321
    #include <algorithm>
    #include <vector>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << "  ";
    }
    int main(void)
    {
      //初始化向量v
      vector < int > v;
      v.push_back(2);
      v.push_back(4);
      v.push_back(3);
      v.push_back(4);
      v.push_back(8);
      //移除4
      vector < int > ::iterator result = remove(v.begin(), v.end(), 4);
      //打印2 3 8
      for_each(v.begin(), result, print);
      cout << endl;
      //打印2 3 8 4 8
      for_each(v.begin(), v.end(), print);
      cout << endl;
      return 0;
    }


       22.18 条件移除remove_if
    remove_if  Remove elements from range (function template)

    //   22.18 条件移除remove_if ---------------------------------------------------
    
    template < class ForwardIterator, class Predicate >
      ForwardIterator remove_if ( ForwardIterator first, ForwardIterator last,
                                  Predicate pred )
    {
      ForwardIterator result = first;
      for ( ; first != last; ++first)
        if (!pred(*first)) *result++ = *first;
      return result;
    }
    // remove的谓词判断版本。 remove的第三个参数,改成了谓词判断。
    
    
    
    // remove_if example
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    bool IsOdd (int i) { return ((i%2)==1); }
    
    int main () {
      int myints[] = {1,2,3,4,5,6,7,8,9};            // 1 2 3 4 5 6 7 8 9
    
      // bounds of range:
      int* pbegin = myints;                          // ^
      int* pend = myints+sizeof(myints)/sizeof(int); // ^                 ^
    
      pend = remove_if (pbegin, pend, IsOdd);        // 2 4 6 8 5 6 7 8 9
                                                     // ^       ^
      cout << "range contains:";
      for (int* p=pbegin; p!=pend; ++p)
        cout << " " << *p;
    
      cout << endl;
     
      return 0;
    }
    
    
    
    // 322
    #include <algorithm>
    #include <vector>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << "  ";
    }
    bool even(int x)
    {
      //偶数
      return x % 2 ? 0 : 1;
    }
    int main(void)
    {
      //初始化向量v
      vector < int > v;
      v.push_back(7);
      v.push_back(2);
      v.push_back(5);
      v.push_back(4);
      v.push_back(1);
      //移除偶数
      vector < int > ::iterator result = remove_if(v.begin(), v.end(), even);
      //打印7 5 1
      for_each(v.begin(), result, print);
      cout << endl;
      //打印7 5 1 4 1
      for_each(v.begin(), v.end(), print);
      cout << endl;
      return 0;
    }


       22.19 不连续重复元素复制unique_copy
    unique_copy  Copy range removing duplicates (function template)

    //   22.19 不连续重复元素复制unique_copy ---------------------------------------------------
    
    
    template <class InputIterator, class OutputIterator>
      OutputIterator unique_copy ( InputIterator first, InputIterator last,
                                   OutputIterator result )
    {
      *result=*first;
      while (++first != last)
      {
        if (!(*result == *first))  // or: if (!pred(*result,*first)) for the pred version
          *(++result)=*first; // 有点精巧,画图可明白。pred左参数,是左边那个与当前值不同那个元素,右参数是当前元素
      }
      return ++result; // 左闭右开原则,返回时要+1
    }
    // 将连续相等的元素过滤掉,只剩下一个
    // 第四个参数可选,如有,是谓词判断的函数(对象)。这个谓词估计不常用。
    // 第三个参数是输出的第一个位置。可以用同一容器,也可以用不同容器。
    
    // unique_copy example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    bool myfunction (int i, int j) {
      return (i==j);
    }
    
    int main () {
      int myints[] = {10,20,20,20,30,30,20,20,10};
      vector<int> myvector (9);                            // 0  0  0  0  0  0  0  0  0
      vector<int>::iterator it;
    
      // using default comparison:
      it=unique_copy (myints,myints+9,myvector.begin());   // 10 20 30 20 10 0  0  0  0
                                                           //                ^
    
      sort (myvector.begin(),it);                          // 10 10 20 20 30 0  0  0  0
                                                           //                ^
    
      // using predicate comparison:
      it=unique_copy (myvector.begin(), it, myvector.begin(), myfunction);
                                                           // 10 20 30 20 30 0  0  0  0
                                                           //          ^
    
      myvector.resize( it - myvector.begin() );            // 10 20 30
    
      // print out content:
      cout << "myvector contains:";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
    
      return 0;
    }
    
    
    //323
    #include <algorithm>
    #include <vector>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << ' ';
    }
    int main(void)
    {
      vector < int > v;
      v.push_back(2);
      v.push_back(5);
      v.push_back(5);
      v.push_back(5);
      v.push_back(6);
      v.push_back(5);
      v.push_back(2);
      //
      int iArray[6] = { 0 };
      //
      unique_copy(v.begin(), v.end(), iArray);
      //打印2 5 6 5 2 0
      for_each(iArray, iArray + 6, print);
      cout << endl;
      return 0;
    }


       22.20 剔除连续重复元素unique
    unique  Remove consecutive duplicates in range (function template)

    //   22.20 剔除连续重复元素unique ---------------------------------------------------
    
    
    template <class ForwardIterator>
      ForwardIterator unique ( ForwardIterator first, ForwardIterator last )
    {
      ForwardIterator result=first;
      while (++first != last)
      {
        if (!(*result == *first))  // or: if (!pred(*result,*first)) for the pred version
          *(++result)=*first;
      }
      return ++result;
    }
    // 将连续相等的元素过滤掉,只剩下一个。在同一容器操作。
    // 第三个参数可无,如有是谓词判断函数(对象)
    
    
    
    // unique algorithm example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    bool myfunction (int i, int j) {
      return (i==j);
    }
    
    int main () {
      int myints[] = {10,20,20,20,30,30,20,20,10};    // 10 20 20 20 30 30 20 20 10
      vector<int> myvector (myints,myints+9);
      vector<int>::iterator it;
    
      // using default comparison:
      it = unique (myvector.begin(), myvector.end()); // 10 20 30 20 10 30 20 20 10
                                                      //                ^
    
      myvector.resize( it - myvector.begin() );       // 10 20 30 20 10
    
      // using predicate comparison:
      unique (myvector.begin(), myvector.end(), myfunction);   // (no changes)
    
      // print out content:
      cout << "myvector contains:";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
    
      return 0;
    }
    
    
    // 325
    #include <algorithm>
    #include <vector>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << ' ';
    }
    int main(void)
    {
      vector < int > v;
      v.push_back(2);
      v.push_back(6);
      v.push_back(6);
      v.push_back(6);
      v.push_back(9);
      v.push_back(6);
      v.push_back(3);
      //
      vector < int > ::iterator result = unique(v.begin(), v.end());
      //打印2 6 9 6 3
      for_each(v.begin(), result, print);
      cout << endl;
      //打印2 6 9 6 3 6 3
      for_each(v.begin(), v.end(), print);
      cout << endl;
      return 0;
    }


       22.21 元素反向reverse
    reverse  Reverse range (function template)

    //   22.21 元素反向reverse ---------------------------------------------------
    
    
    template <class BidirectionalIterator>
      void reverse ( BidirectionalIterator first, BidirectionalIterator last)
    {
      while ((first!=last)&&(first!=--last))
        swap (*first++,*last);
    }
    // 反转元素
    
    
    // reverse algorithm example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int main () {
      vector<int> myvector;
      vector<int>::iterator it;
    
      // set some values:
      for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9
    
      reverse(myvector.begin(),myvector.end());       // 9 8 7 6 5 4 3 2 1
    
      // print out content:
      cout << "myvector contains:";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
    
      return 0;
    }
    
    
    //326
    #include <algorithm>
    #include <vector>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << ' ';
    }
    
    int main(void)
    {
      vector < int > v(10);
      for(unsigned int i = 0; i < v.size(); i++)
        v[i] = i;
      for_each(v.begin(), v.end(), print);
      cout << endl;
      //
      reverse(v.begin(), v.end());
      for_each(v.begin(), v.end(), print);
      cout << endl;
      return 0;
    }


       22.22 反向复制reverse_copy
    reverse_copy  Copy range reversed (function template)

    //   22.22 反向复制reverse_copy ---------------------------------------------------
    
    
    template <class BidirectionalIterator, class OutputIterator>
      OutputIterator reverse_copy ( BidirectionalIterator first,
                                    BidirectionalIterator last, OutputIterator result )
    {
      while (first!=last) *result++ = *--last;
      return result;
    }
    
    // 从后向前,复制到另一容器。
    // 复制到同一容器,可以吗? 请见以下第二个程序,my test。
    // my test:复制到同一空间(范围),会产生冲突。复制到同一容器不同范围,木有关系。
    
    
    // reverse_copy example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int main () {
      int myints[] ={1,2,3,4,5,6,7,8,9};
      vector<int> myvector;
      vector<int>::iterator it;
    
      myvector.resize(9);
    
      reverse_copy (myints, myints+9, myvector.begin());
    
      // print out content:
      cout << "myvector contains:";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
    
      return 0;
    }
    
    
    
    // reverse_copy example。 my test:复制到同一空间(范围),会产生冲突。复制到同一容器不同范围,木有关系。
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int main () {
      int myints[] ={1,2,3,4,5,6,7,8,9};
      vector<int> v(myints,myints+9);
      vector<int>::iterator it;
      
      reverse_copy(v.begin(),v.begin()+3,v.begin());
    
      // print out content:
      cout << "myvector contains:";
      for (it=v.begin(); it!=v.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
    
      return 0;
    }
    
    
    // 327
    #include <algorithm>
    #include <vector>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << ' ';
    }
    int main(void)
    {
      vector < int > v(10);
      for(unsigned int i = 0; i < v.size(); i++)
        v[i] = i;
      //
      int iArray[10] = {0};
      //
      reverse_copy(v.begin(), v.end(), iArray);
      for_each(iArray, iArray + 10, print);
      cout << endl;
      return 0;
    }


       22.23 旋转rotate
    rotate  Rotate elements in range (function template)

    //   22.23 旋转rotate ---------------------------------------------------
    
    template <class ForwardIterator>
      void rotate ( ForwardIterator first, ForwardIterator middle,
                    ForwardIterator last )
    {
      ForwardIterator next = middle;
      while (first!=next)
      {
        swap (*first++,*next++);
        if (next==last) next=middle;
        else if (first == middle) middle=next; // 这种交换方法,非常新颖。可以画图理解
      }
    }
    // 旋转交换。[first,middle) 与 [middle,last),两区域的元素,进行交换。两区域的元素个数不一定要相等。
    // 如 1,2,3,4,5 ,以4为middle,--> 4,5,1,2,3 。 三个参数:first, middle, last
    
    
    
    // rotate algorithm example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int main () {
      vector<int> myvector;
      vector<int>::iterator it;
    
      // set some values:
      for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9
    
      rotate(myvector.begin(),myvector.begin()+3,myvector.end());
                                                      // 4 5 6 7 8 9 1 2 3
    
      // print out content:
      cout << "myvector contains:";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
    
      return 0;
    }
    
    
    // 329
    #include <algorithm>
    #include <vector>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << ' ';
    }
    int main(void)
    {
      vector < int > v(10);
      unsigned int i;
      for(i = 0; i < v.size(); i++)
        v[i] = i + 1;
      for_each(v.begin(), v.end(), print);
      cout << endl;
      //
      cout << "开始旋转,middle元素=" << *(v.begin() + 7) << endl;
      rotate(v.begin(), v.begin() + 7, v.end());
      for_each(v.begin(), v.end(), print);
      return 0;
    }


       22.24 旋转复制rotate_copy
    rotate_copy  Copy rotated range (function template)

    //   22.24 旋转复制rotate_copy ---------------------------------------------------
    
    
    template <class ForwardIterator, class OutputIterator>
      OutputIterator rotate_copy ( ForwardIterator first, ForwardIterator middle,
                                   ForwardIterator last, OutputIterator result )
    {
      result=copy (middle,last,result);
      return copy (first,middle,result);
    }
    // 与rotate类似,无非是拷贝到了另一容器。四个参数:first, middle, last, result
    
    
    
    // rotate_copy algorithm example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int main () {
      int myints[] = {10,20,30,40,50,60,70};
    
      vector<int> myvector;
      vector<int>::iterator it;
    
      myvector.resize(7);
    
      rotate_copy(myints,myints+3,myints+7,myvector.begin());
    
      // print out content:
      cout << "myvector contains:";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
    
      return 0;
    }
    
    
    
    
    // 329
    #include <algorithm>
    #include <vector>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << ' ';
    }
    int main(void)
    {
      vector < int > v(10);
      for(unsigned int i = 0; i < v.size(); i++)
        v[i] = i + 1;
      //
      int iArray[10] ={0};
      //
      cout << "开始旋转复制,*middle选为" << *(v.begin() + 7) << endl;
      rotate_copy(v.begin(), v.begin() + 7, v.end(), iArray);
      for_each(iArray, iArray + 10, print);
      cout << endl;
      return 0;
    }


       22.25 随机抖动random_shuffle
    random_shuffle  Rearrangle elements in range randomly (function template)  

    //   22.25 随机抖动random_shuffle ---------------------------------------------------
    
    
    template <class RandomAccessIterator, class RandomNumberGenerator>
      void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last,
                            RandomNumberGenerator& rand )
    {
      iterator_traits<RandomAccessIterator>::difference_type i, n;
      n = (last-first);
      for (i=2; i<n; ++i) swap (first[i],first[rand(i)]);
    }
    // shuffle 洗牌。第三个参数可无,如有,是自定义的随机发生器。
    
    
    
    // random_shuffle example
    #include <iostream>
    #include <algorithm>
    #include <functional>
    #include <vector>
    #include <ctime>
    #include <cstdlib>
    using namespace std;
    
    // random generator function:
    ptrdiff_t myrandom (ptrdiff_t i) { return rand()%i;}
    
    // pointer object to it:
    ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom;
    
    int main () {
      srand ( unsigned ( time (NULL) ) );
      vector<int> myvector;
      vector<int>::iterator it;
    
      // set some values:
      for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9
    
      // using built-in random generator:
      random_shuffle ( myvector.begin(), myvector.end() );
    
      // using myrandom:
      random_shuffle ( myvector.begin(), myvector.end(), p_myrandom);
    
      // print out content:
      cout << "myvector contains:";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
    
      return 0;
    }
    
    
    //331
    #include <algorithm>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << ' ';
    }
    int main(void)
    {
      int iArray[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
      cout << "随机抖动iArray三次" << endl;
      for(int i = 0; i < 3; i++)
      {
        random_shuffle(iArray, iArray + 10);
        for_each(iArray, iArray + 10, print);
        cout << endl;
      }
      return 0;
    }


       22.26 随机采样random_sample
    ...

    //   22.26 随机采样random_sample ---------------------------------------------------
    
    
    
    // 333 。random_sample不是标准函数。我们可以采用另两个函数,来达到相同的目的:
    #include <algorithm>
    #include <vector>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << ' ';
    }
    int main(void)
    {
      vector < int > v(10);
      for(unsigned int i = 0; i < v.size(); i++)
        v[i] = i % 8;
      //
      cout << "v= ";
      for_each(v.begin(), v.end(), print);
      cout << endl;
      //
      const int n = 6; //采样个数
      int iArray[n];
      //random_sample(v.begin(), v.end(), iArray, iArray + n);
      random_shuffle(v.begin(),v.end());
      copy(v.begin(),v.begin()+n,iArray);
      //
      cout << n << "个采样元素为 ";
      for_each(iArray, iArray + n, print);
      cout << endl;
      return 0;
    }


       22.27 容器分割partition
    partition  Partition range in two (function template)  

    //   22.27 容器分割partition ---------------------------------------------------
    
    template <class BidirectionalIterator, class Predicate>
      BidirectionalIterator partition ( BidirectionalIterator first,
                                        BidirectionalIterator last, Predicate pred )
    {
      while (first!=last) // 可以看到快排的影子
      {
        --last;
        while (first!=last && pred(*first)) ++first;
        while (first!=last && !pred(*last)) --last;
        if (first!=last) swap (*first++,*last);
      }
      return first;
    }
    // 把序列分成两部分,前一部分满足条件,后一部分不满足条件。三个参数。
    
    
    
    // partition algorithm example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    bool IsOdd (int i) { return (i%2)==1; }
    
    int main () {
      vector<int> myvector;
      vector<int>::iterator it, bound;
    
      // set some values:
      for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9
    
      bound = partition (myvector.begin(), myvector.end(), IsOdd);
    
      // print out content:
      cout << "odd members:";
      for (it=myvector.begin(); it!=bound; ++it)
        cout << " " << *it;
    
      cout << "
    even members:";
      for (it=bound; it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
    
      return 0;
    }
    
    
    
    // 334
    #include <algorithm>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << ' ';
    }
    bool less10(int x)
    {
      return x < 10;
    }
    int main(void)
    {
      int iArray[10] = { 16,  - 1, 3, 11, 2, 5, 8, 20, 9, 3 };
      int *result = partition(iArray, iArray + 10, less10);
      cout << "按小于10进行分割" << endl;
      for_each(iArray, iArray + 10, print);
      cout << endl;
      //
      cout << "partition算法返回的分界元素为 " <<  *result << endl;
      return 0;
    }


       22.28 容器稳定分割stable_partition
    stable_partition  Divide range in two groups - stable ordering (function template)  

    //   22.28 容器稳定分割stable_partition ---------------------------------------------------
    
    // partition 的稳定版本
    
    // stable_partition example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    bool IsOdd (int i) { return (i%2)==1; }
    
    int main () {
      vector<int> myvector;
      vector<int>::iterator it, bound;
    
      // set some values:
      for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9
    
      bound = stable_partition (myvector.begin(), myvector.end(), IsOdd);
    
      // print out content:
      cout << "odd members:";
      for (it=myvector.begin(); it!=bound; ++it)
        cout << " " << *it;
    
      cout << "
    even members:";
      for (it=bound; it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
    
      return 0;
    }
    
    
    // 338
    #include <algorithm>
    #include <iostream>
    using namespace std;
    void print(int x)
    {
      cout << x << ' ';
    }
    bool less10(int x)
    {
      return x < 10 ? 1 : 0;
    }
    int main(void)
    {
      int iArray[10] = { 16,  - 1, 3, 11, 2, 5, 8, 20, 9, 3 };
      for_each(iArray, iArray + 10, print);
      cout << endl;
      //进行稳定分割
      int *result = stable_partition(iArray, iArray + 10, less10);
      cout << "按小于10稳定分割,iArray数组变为" << endl;
      for_each(iArray, iArray + 10, print);
      cout << endl;
      //
      cout << "iArray数组有如下小于10的整数" << endl;
      for_each(iArray, result, print);
      cout << endl;
      //
      cout << "stable_partition算法返回的分界元素为 " <<  *result << endl;
      return 0;
    }


       22.29 本章小结

     

    /***************************************************************************************************************
    
    //   22.29 本章小结 ---------------------------------------------------
    
       22.1 元素复制copy
    // 把序列一中某范围内的元素,复制到序列二中去。前两个参数是序列一范围,第三个参数是序列二的开始位置
    // 当序列二不够大时,不够装部分将复制不过去。
    
       22.2 反向复制copy_backward
    // 把序列一中某范围内的元素,复制到序列二中去。前两个参数是序列一范围,第三个参数是序列二的结束位置的下一个位置。
    // 两序列可以是同一序列
    
       22.3 元素交换swap
    // 不通过指针交换两个元素
    
       22.4 迭代器交换iter_swap
    // 利用指针(迭代器)交换值
    
       22.5 区间元素交换swap_ranges
    // 两个区间中的元素分别交换。只有三个参数,第四个参数又省了
    // 注意:第二个序列要足够长,否则会出现异常。
    
       22.6 元素变换transform
    // 加转换的copy。而且转换函数可以是一元的,也可以是二元的。
    // 一元的参数有四个:开始两个表示第一序列范围,第三个是结果存放开始位置,第四个是一元函数(对象)
    // 二元的参数有五个:开始两个表示第一序列范围,第三个是第二序列开始位置,第四个是结果存放开始位置,第五个是二元函数(对象)
    
       22.7 替换Replace
    // 在指定范围内旧值换新值
    
       22.8 条件替换replace_if
    // 当元素满足什么条件时,更新为新值
    
       22.9 替换和复制replace_copy
    // 将第一序列某范围内的元素,复制到第二序列中去。在这个复制过程中,将旧值,替换为新值
    // 前两个参数表示第一序列范围,第三个参数为第二序列开始位置(木有结束位置),第四、五个参数为旧、新值
    
       22.10 条件替换和复制replace_copy_if
    // replace_copy的谓词判断版本。 木有旧值了,替换为一个谓词。这样应用范围更广
    
       22.11 填充fill
    // 在序列范围内,均填充上某新值。
    
       22.12 n次填充fill_n
    // 在起始位置开始,填充n个value。三个参数:起始位置、几个、新值。
    
       22.13 随机生成元素generate
    // 在指定范围内,填充上第三个参数gen产生的值。
    // gen是个函数(对象),木有参数。所以产生的值,纯粹取决于gen,与容器原来的元素无关
    
       22.14 随机生成n个元素generate_n
    // 在开始位置之后,填充n个gen()产生的值。三个参数:起始位置、几个、gen产生的值。
    
       22.15 移除复制remove_copy
    // 将容器中,不等于某值的元素,复制到另一容器中。
    // 参数有四个:前两个表示范围,第三个是另一容器的起始位置,第四个是某值。
    // 这样就产生了一个问题,另一容器,可以是同一容器么?可以的。
    
       22.16 条件移除复制remove_copy_if
    // remove_copy 的带谓词判断的版本。把第四个参数,改成了函数(对象)。
    
       22.17 移除remove
    // 将容器中等于某值的元素删除。
    // 因为在同一容器中操作,所以返回值值得关注。返回排列完删除某些元素之后的序列的后一个位置。
    // 如果要将数据复制到另一容器,可以考虑用remove_copy
    
       22.18 条件移除remove_if
    // remove的谓词判断版本。 remove的第三个参数,改成了谓词判断。
    
       22.19 不连续重复元素复制unique_copy
    // 将连续相等的元素过滤掉,只剩下一个
    // 第四个参数可选,如有,是谓词判断的函数(对象)。这个谓词估计不常用。
    // 第三个参数是输出的第一个位置。可以用同一容器,也可以用不同容器。
    
       22.20 剔除连续重复元素unique
    // 将连续相等的元素过滤掉,只剩下一个。在同一容器操作。
    // 第三个参数可无,如有是谓词判断函数(对象)
    
       22.21 元素反向reverse
    // 反转元素
    
       22.22 反向复制reverse_copy
    // 从后向前,复制到另一容器。
    // 复制到同一容器,可以吗? 请见以下第二个程序,my test。
    // my test:复制到同一空间(范围),会产生冲突。复制到同一容器不同范围,木有关系。
    
       22.23 旋转rotate
    // 旋转交换。[first,middle) 与 [middle,last),两区域的元素,进行交换。两区域的元素个数不一定要相等。
    // 如 1,2,3,4,5 ,以4为middle,--> 4,5,1,2,3 。 三个参数:first, middle, last
    
       22.24 旋转复制rotate_copy
    // 与rotate类似,无非是拷贝到了另一容器。四个参数:first, middle, last, result
    
       22.25 随机抖动random_shuffle
    // shuffle 洗牌。第三个参数可无,如有,是自定义的随机发生器。
    
       22.26 随机采样random_sample
    //random_sample不是标准函数。我们可以采用另两个函数,来达到相同的目的
      //random_sample(v.begin(), v.end(), iArray, iArray + n);
      random_shuffle(v.begin(),v.end());
      copy(v.begin(),v.begin()+n,iArray);
    
       22.27 容器分割partition
    // 把序列分成两部分,前一部分满足条件,后一部分不满足条件。三个参数。
    
       22.28 容器稳定分割stable_partition
    // partition 的稳定版本
    
       22.29 本章小结
    // 这就是小结
    
    
    ***********************************************************************************************************/

      

    00TOP00

  • 相关阅读:
    数学+高精度 ZOJ 2313 Chinese Girls' Amusement
    最短路(Bellman_Ford) POJ 1860 Currency Exchange
    贪心 Gym 100502E Opening Ceremony
    概率 Gym 100502D Dice Game
    判断 Gym 100502K Train Passengers
    BFS POJ 3278 Catch That Cow
    DFS POJ 2362 Square
    DFS ZOJ 1002/HDOJ 1045 Fire Net
    组合数学(全排列)+DFS CSU 1563 Lexicography
    stack UVA 442 Matrix Chain Multiplication
  • 原文地址:https://www.cnblogs.com/xin-le/p/4115586.html
Copyright © 2011-2022 走看看