首页 > 代码库 > 第22章 变易算法
第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 元素复制copycopy Copy range of elements (function template) 22.2 反向复制copy_backwardcopy_backward Copy range of elements backwards (function template) 22.3 元素交换swapswap Exchange values of two objects (function template) 22.4 迭代器交换iter_swapiter_swap Exchange values of objects pointed by two iterators (function template) 22.5 区间元素交换swap_rangesswap_ranges Exchange values of two ranges (function template) 22.6 元素变换transformtransform Apply function to range (function template) 22.7 替换Replacereplace Replace value in range (function template) 22.8 条件替换replace_ifreplace_if Replace values in range (function template) 22.9 替换和复制replace_copyreplace_copy Copy range replacing value (function template) 22.10 条件替换和复制replace_copy_ifreplace_copy_if Copy range replacing value (function template) 22.11 填充fillfill Fill range with value (function template) 22.12 n次填充fill_nfill_n Fill sequence with value (function template) 22.13 随机生成元素generategenerate Generate values for range with function (function template) 22.14 随机生成n个元素generate_ngenerate_n Generate values for sequence with function (function template) 22.15 移除复制remove_copyremove_copy Copy range removing value (function template) 22.16 条件移除复制remove_copy_ifremove_copy_if Copy range removing values (function template) 22.17 移除removeremove Remove value from range (function template) 22.18 条件移除remove_ifremove_if Remove elements from range (function template) 22.19 不连续重复元素复制unique_copyunique_copy Copy range removing duplicates (function template) 22.20 剔除连续重复元素uniqueunique Remove consecutive duplicates in range (function template) 22.21 元素反向reversereverse Reverse range (function template) 22.22 反向复制reverse_copyreverse_copy Copy range reversed (function template) 22.23 旋转rotaterotate Rotate elements in range (function template) 22.24 旋转复制rotate_copyrotate_copy Copy rotated range (function template) 22.25 随机抖动random_shufflerandom_shuffle Rearrangle elements in range randomly (function template) 22.26 随机采样random_sample... 22.27 容器分割partitionpartition Partition range in two (function template) 22.28 容器稳定分割stable_partitionstable_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 + 3class 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
第22章 变易算法