第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 本章小结

*/



 

  第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 << "\nsecond 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 << "\nsecond 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 << "\nl2元素为: ";
  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 << "\nmyvector 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 << "\neven 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 << "\neven 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

时间: 2024-10-29 19:08:42

第22章 变易算法的相关文章

第21章 非变易算法

   第21章 非变易算法     Non-modifying sequence operations   21.0 advance, distance     为了了解模板,先了解一下这两个迭代器操作函数   21.1 逐个容器元素for_each     for_each  Apply function to range (template function)   21.2 查找容器元素find     find  Find value in range (function template

第十一章 执行查询算法

第十一章      执行查询算法 基本概念: 三类查找方法:线性查找.树形查找.哈希表查找 动态查找表:在查找的同时,对表做修改操作(如插入和删除),则相应的表称为动态查找表 静态查找表:与动态查找表相反 查找过程中对关键字需要执行的平均比较次数(也称平均比较长度作为衡量一个查找算法优劣的标准 平均比较长度: 其中:n是结点的个数:pi是查找第i个结点的概率.若不特别申明,认为每个结点的查找概率相等,都为1/n:ci是找到第i个结点所需进行的比较次数. 线性查找: 基本思想:从表的一端开始,顺序

stl非变易算法(一)

C++ STL的非变易算法是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理.元素查找.子序列搜索.统计和匹配.非变易算法具有极为广泛的适用性,基本上可应用于各种容器. 逐个容器元素for_each C++ STL提供了一个for_each函数,用于对容器的元素进行循环操作.它对迭代区间[first, last)所指的每一个元素,执行由单参函数对象fn所定义的操作.原型如下: template<class InputIterator, class Function> Function

第23章 排序算法(包括merge等)

  第23章 排序算法  Sorting:1 sort Sort elements in range (function template)2 stable_sort Sort elements preserving order of equivalents (function template)3 partial_sort Partially Sort elements in range (function template)4 partial_sort_copy Copy and parti

4.20日第13次作业.,20章战略管理,21章业务流程管理和重组,22章知识管理,高项,29-田哲琦

4.20日第13次作业.,20章战略管理,21章业务流程管理和重组,22章知识管理,高项,29-田哲琦 20章.战略管理1.企业战略的特点有哪些?P420-421 答:1).全局性 2).长远性 3).抗争性 4).纲领性 2.企业战略决策的特点有哪些?P421答:1).决策的对象是复杂的,很难把握住它的结构,并且是没有先例的,对其处理上也是没有经验可循. 2).面对的问题常常是突发性的.难以预料的.所依靠的是来自外部的关于未来如何变化的很少的情报. 3).决策的性质直接涉及到企业的前途. 4)

stl变易算法(二)

本篇接着前篇stl变易算法(一)继续讲述变易算法.主要介绍transform.replace.replace_if.replace_copy以及replace_copy_if的用法及实现代码,并给出测试用例. 元素变换transform transform算法用于实行容器元素的变换操作.如下两个使用原型,一个将迭代器区间[first,last)中元素,执行一元函数对象op操作,变换后的结果存放在[result,result+(last-first))区间中.另一个将迭代器区间[first1,la

stl变易算法(一)

C++ STL的变易算法是一组能够修改容器元素数据的模板函数,可进行序列容器的复制.交换.替换.填充.移除.旋转等.这些算法对迭代器有较高的要求,具体的迭代器类型随各个算法而定,或向前迭代器.或双向迭代器.又或者是随机迭代器,以提供算法所需要的迭代器操作.应用变易算法时,先要检查容器的迭代器是否符合要求,防止产生编译错误. 元素复制copy C++STL提供一个用于容器间元素拷贝的copy算法,将迭代区间[first,last)的元素复制到由复制目标迭代器result给定的区间[result,r

C++ Primer 读书笔记:第11章 泛型算法

第11章 泛型算法 1.概述 泛型算法依赖于迭代器,而不是依赖容器,需要指定作用的区间,即[开始,结束),表示的区间,如上所示 此外还需要元素是可比的,如果元素本身是不可比的,那么可以自己定义比较函数. 2.常用的泛型算法函数: fill,fill_n, copy, replace, sort, unique, count_if, stable_sort 此外在有一个谓词函数会结合以上的函数使用,像sort, count_if等 3.再谈迭代器 (1)插入迭代器 back_inserter, f

STL非变易算法

非变易算法:原则上不会变更操作数据的算法. [1]    for_each:逐个容器元素,原型for_each(InputIter first, InputIter last, Function f). [2]    find:顺序查找容器元素,原型InputIter find(InputIter first, InputIter last, constT &val, input_iterator_tag). [3]    find_if:条件查找容器,原型InputIter find_if(I