非变异算法
非变异算法就是:不直接改变其操作的数据结构的元素
1,循环: for_each
template<class Init,class Fun>
Fun for_each(Init first,Init last, Fun f);
f 为全局函数或者一元函数
example:::
1>
1 #include2 #include 3 #include 4 5 using namespace std; 6 7 void PrintCube(int n) 8 { 9 cout << n * n * n << " ";10 }11 12 int main()13 {14 const int VECTOR_SIZE = 8;15 16 typedef vector IntVector;17 typedef IntVector::iterator IntVectorIt;18 19 IntVector Numbers(VECTOR_SIZE);20 IntVectorIt start,end,it;21 22 for(int i = 0 ;i < VECTOR_SIZE ;i ++)23 Numbers[i] = i + 1;24 25 start = Numbers.begin();26 end = Numbers.end();27 28 cout << "Numbers { ";29 for(it = start;it != end;it ++)30 cout << *it << " ";31 32 cout << " }\n" << endl;33 34 for_each(start,end,PrintCube);35 36 cout << endl;37 38 return 0;39 }
2>
1 #include2 #include 3 4 using namespace std; 5 6 class PrintInfo 7 { 8 private: 9 int nSum;10 int nMax;11 int nMin;12 int count;13 public:14 PrintInfo() : count(0),nSum(0) {}15 16 int GetSum() { return nSum; }17 int GetMax() { return nMax; }18 int GetMin() { return nMin; }19 20 void operator () (int x)21 {22 if(count == 0)23 {24 nMax = x;25 nMin = x;26 }27 28 else29 {30 if(nMax < x)31 {32 nMax = x;33 }34 if(nMin > x)35 {36 nMin = x;37 }38 }39 40 nSum += x;41 count ++;42 }43 };44 45 int main()46 {47 int A[] = { 1,4,2,8,5,7};48 const int N = sizeof(A) / sizeof(int);49 50 PrintInfo P = for_each(A,A+N,PrintInfo());51 cout << "SUM : " << P.GetSum() << endl;52 cout << "MAX : " << P.GetMax() << endl;53 cout << "MIN : " << P.GetMin() << endl;54 55 return 0;56 }
3>
1 #include2 #include 3 #include 4 5 using namespace std; 6 7 template 8 class PrintInfo : unary_function 9 {10 private:11 T nSum;12 T nMax;13 T nMin;14 int count;15 public:16 PrintInfo() : count(0),nSum(0) {}17 18 T GetSum() { return nSum; }19 T GetMax() { return nMax; }20 T GetMin() { return nMin; }21 22 _outPara operator() (T x)23 {24 if(count == 0)25 {26 nMax = x;27 nMin = x;28 }29 else30 {31 if(nMax < x)32 {33 nMax = x;34 }35 if(nMin > x)36 {37 nMin = x;38 }39 }40 41 nSum += x;42 count ++;43 }44 45 };46 47 int main()48 {49 float A[] = { 1.5,4.2,2.6,8.9,5.7,7.1};50 const int N = sizeof(A) / sizeof(int);51 52 PrintInfo &P = for_each(A,A+N,PrintInfo ());53 54 cout << "SUM : " << P.GetSum() << endl;55 cout << "MAX : " << P.GetMax() << endl;56 cout << "MIN : " << P.GetMin() << endl;57 58 return 0;59 }
2,查询:
主要的查询函数又:
find(),find_if(),find_first_of(),adjacent_find(),find_end(),search(),search_n()
template<class Init,class T>
Init find(Init first,Init last, const T & val);
template<class Init,class Pred>
Init find_if(Init first, Init last, Pred pr);
template<class FwdIt1, class FwdIt2>
FwdIt1 find_first_of(FwdIt1 first1,FwdIt1 last1,FwdIt2 first2, FwdIt2 last2);
template<class FwdIt2,class FwdIt2,class Pred>
FwdIt1 find_first_of(FwdIt1 first1,FwdIt1 last1,FwdIt2 first2,FwdIt2 last2, Pred pr);
template<class FwdIt>
FwdIt adjacent_find(FwdIt first, FwdIt last);
template<class FwdIt,class Pred>
FwdIt adjacent_find(FwdIt first,FwdIt last, Pred pr);
template<class FwdIt1,class FwdIt2>
FwdIt1 find_end(FwdIt1 first1,FwdIt1 last1,FwdIt2 first2,FwdIt2 last2);
template<class FwdIt1,class FwdIt2,class Pred>
FwdIt1 find_end(FwdIt1 first1,FwdIt1 last1,FwdIt2 first2,FwdIt2 last2, Pred pr);
template<class FwdIt1,class FwdIt2>
FwdIt1 search(FwdIt1 first1,FwdIt1 last1,FwdIt2 first2,FwdIt2 last2);
template<class FwdIt1,class FwdIt2,class Pred>
FwdIt1 search(FwdIt1 first1,FwdIt1 last1,FwdIt2 first2,FwdIt2 last2 ,Pred pr);
template<class FwdIt,class Dist,class T>
FwdIt search_n(FwdIt first,FwdIt last,Dist n,const T &val);
template<class FwdIt ,class Dist,class T,class Pred>
FwdIt search_n(FwdIt first,FwdIt last,Dist n,const T & val,Pred pr);
Example ::::
1,>
1 #include2 #include 3 4 using namespace std; 5 6 bool greater(int m) 7 { 8 return m > 4; 9 }10 11 int main()12 {13 int a[] = { 1,2,2,2,3,4,4,5,6,7,1,2,2,3};14 int nSize = sizeof(a) / sizeof(int);15 16 cout << "org array: " << endl;17 for(int i = 0 ;i < nSize ;i ++)18 {19 cout << a[i] << "\t";20 }21 cout << endl << endl;22 23 int *p1 = find(a,a+nSize,3);24 if(p1 != a+nSize)25 cout << "(find) first equal 3 is : " << p1-a <<"\t value : " << *p1 << endl;26 27 int *p2 = find_if(a,a+nSize,greater);28 if(p2 != a + nSize)29 cout << "(find_if) first > 4 is : " << p2-a << "\t value : " << *p2 << endl;30 31 int b[] = { 10,12,6};32 int nSize2 = sizeof(b) / sizeof(int);33 int *p3 = find_first_of(a,a+nSize, b,b+nSize2);34 if(p3 != a+nSize)35 cout << "(find_first_of) first appear b in array a is : " << p3-a << "\t value: " << *p3 << endl;36 37 int *p4 = adjacent_find(a,a+nSize);38 if(p4 != a+nSize)39 cout << "(adjacent_find) first appear familiar is : " << p4-a << "\t value : " << *p4 << endl;40 41 int c[]={ 2,3};42 int nSize3 = sizeof(c) / sizeof(int);43 int *p5 = find_end(a,a+nSize,c,c+nSize3);44 if(p5 != a+nSize)45 cout << "last match array c is : " << p5-a << endl;46 47 int *p6 = search(a,a+nSize,c,c+nSize3);48 if(p6 != a + nSize)49 cout << "First match array c is : " << p6-a << endl;50 51 int *p7 = search_n(a,a+nSize,3,2);52 if(p7 != a + nSize)53 cout << "First appear 3 times 2 is : " << p7-a << endl;54 55 return 0;56 }
2,>
1 #include2 #include 3 #include 4 #include 5 6 using namespace std; 7 8 class Student 9 {10 public:11 int NO;12 string strName;13 Student(int NO,string strName)14 {15 this -> NO = NO;16 this -> strName = strName;17 }18 19 bool operator == (int NO)20 {21 return (this->NO == NO);22 }23 };24 25 int main()26 {27 vector v;28 29 Student s1(101,"zhangsan");30 Student s2(102,"lisi");31 32 v.push_back(s1);33 v.push_back(s2);34 35 vector ::iterator begin,end,it_find;36 begin = v.begin();37 end = v.end();38 39 int nFindNO = 102;40 it_find = find(begin,end,nFindNO);41 42 cout << "lookup ID : " << nFindNO << "information : " << endl;43 44 if(it_find != end)45 cout << "ID : " << (*it_find).NO << "\t" << "name : " << (*it_find).strName << endl;46 else47 cout << "No ID student!!!" << endl;48 49 return 0;50 }
3,>
1 #include2 #include 3 #include 4 #include 5 6 using namespace std; 7 8 const int NO_FIND = 1; 9 const int GRADE_FIND = 2; 10 11 class Student 12 { 13 public: 14 int NO; 15 string strName; 16 int grade; 17 static int mark; 18 19 20 Student(int NO,string strName,int grade) 21 { 22 this -> NO = NO; 23 this -> strName = strName; 24 this -> grade = grade; 25 } 26 27 bool operator == (int n) 28 { 29 if(mark == NO_FIND) 30 return NO == n; 31 else 32 return grade == n; 33 } 34 35 bool operator == (string name) 36 { 37 return strName.compare(name) == 0; 38 } 39 }; 40 41 int Student::mark = -1; 42 43 ostream & operator << (ostream &os,Student &s) 44 { 45 os << s.NO << "\t" << s.strName << "\t" << s.grade << endl; 46 47 return os; 48 } 49 50 class StudFindIf 51 { 52 private: 53 int low; 54 int high; 55 public: 56 StudFindIf(int low,int high) 57 { 58 this -> low = low; 59 this -> high = high; 60 } 61 62 bool operator() (Student &s) 63 { 64 return s.grade >= low && s.grade <= high; 65 } 66 }; 67 68 class StudentCollect 69 { 70 vector vecStud; 71 public: 72 bool Add(Student &s) 73 { 74 vecStud.push_back(s); 75 return true; 76 } 77 78 bool FindByNO(int no) 79 { 80 Student::mark = NO_FIND; 81 vector ::iterator te = find(vecStud.begin(),vecStud.end(),no); 82 83 if(te != vecStud.end()) 84 cout << *te << endl; 85 else 86 cout << "ID " << no << "has no note" << endl; 87 88 return true; 89 } 90 91 bool FindByNO(int no[],int nSize) 92 { 93 bool bFind = false; 94 Student::mark = NO_FIND; 95 96 vector ::iterator te = find_first_of(vecStud.begin(),vecStud.end(),no,no+nSize); 97 98 while(te != vecStud.end()) 99 {100 bFind = true;101 cout << *te << endl;102 103 te ++;104 te = find_first_of(te,vecStud.end(),no,no+nSize);105 }106 if(!bFind)107 cout << "have no notes" << endl;108 return true;109 }110 111 bool FindByName(string name)112 {113 bool bFind = false;114 vector ::iterator te = find(vecStud.begin(),vecStud.end(),name);115 116 while(te != vecStud.end())117 {118 bFind = true;119 cout << *te << endl;120 121 te ++;122 te = find(te,vecStud.end(),name);123 }124 125 if(!bFind)126 cout << "name:" << name << "no notes" << endl;127 128 return true;129 }130 131 bool FindByGrade(int grade)132 {133 Student::mark = GRADE_FIND;134 135 bool bFind = false;136 vector ::iterator te = find(vecStud.begin(),vecStud.end(),grade);137 138 while(te != vecStud.end())139 {140 bFind = true;141 cout << *te << endl;142 143 te ++;144 te = find(te,vecStud.end(),grade);145 }146 147 if(!bFind)148 cout << "grade : " << grade << "has no notes" << endl;149 150 return true;151 }152 153 bool FindByRange(int low,int high)154 {155 bool bFind = false;156 157 StudFindIf sf(low,high);158 159 vector ::iterator te = find_if(vecStud.begin(),vecStud.end(),sf);160 while(te != vecStud.end())161 {162 bFind = true;163 cout << *te << endl;164 165 te ++;166 te = find_if(te,vecStud.end(),sf);167 }168 169 return true;170 }171 };172 173 int main()174 {175 Student s1(101,"zhangsan",50);176 Student s2(102,"lisi",70);177 Student s3(103,"zhangsan",60);178 Student s4(104,"wangwu",50);179 Student s5(105,"wagnwu",80);180 181 StudentCollect manage;182 manage.Add(s1);183 manage.Add(s2);184 manage.Add(s3);185 manage.Add(s4);186 manage.Add(s5);187 188 cout << "find via ID(102): " << endl;189 manage.FindByNO(102);190 cout << "find via name(zhangsan) : " << endl;191 manage.FindByName("zhangsan");192 cout <<"find via grade(50) : " << endl;193 manage.FindByGrade(50);194 195 int a[] = { 101,105,103,107};196 cout << "find via ID group {101,105,103,107} : " << endl;197 manage.FindByNO(a,sizeof(a)/sizeof(int));198 199 cout << "find via grade range[55,70] : " << endl;200 manage.FindByRange(55,70);201 202 return 0;203 }
3,计数:
count() , count_if()
template<class Init, class T>
size_t count(Init first, Init last, const T &val);
template<class Init, class Pred , class Dist>
size_t count_if(Init first,Init last, Pred pr);
示例:
1>
1 #include2 #include 3 4 using namespace std; 5 6 int main() 7 { 8 int A[] = { 2,0,4,6,0,3,1,-7}; 9 10 const int N = sizeof(A) / sizeof(int);11 12 cout << "Number of zeros : " << count(A,A+N,0) << endl;13 14 return 0;15 }
2,>
1 #include2 #include 3 #include 4 5 using namespace std; 6 7 class Student 8 { 9 public:10 int NO;11 string strName;12 int grade;13 14 Student(int NO,string strName,int grade)15 {16 this -> NO = NO;17 this -> strName = strName;18 this -> grade = grade;19 }20 21 bool operator == (int grade)22 {23 return this -> grade == grade;24 }25 };26 27 int main()28 {29 Student s1(1000,"zhangsan",80);30 Student s2(1001,"lisi",85);31 Student s3(1002,"wangwu",80);32 Student s4(1003,"zhaoliu",80);33 34 vector v;35 v.push_back(s1);36 v.push_back(s2);37 v.push_back(s3);38 v.push_back(s4);39 40 int nCount = count(v.begin(),v.end(),80);41 cout << "the counts grade equal to 80 is : " << nCount << endl;42 43 return 0;44 }
3,>
1 #include2 #include 3 #include 4 5 using namespace std; 6 7 class Student 8 { 9 public:10 int NO;11 string strName;12 int grade;13 14 Student(int NO,string strName,int grade)15 {16 this -> NO = NO;17 this -> strName = strName;18 this -> grade = grade;19 }20 21 bool operator == (int grade)22 {23 return this -> grade == grade;24 }25 };26 27 28 class MatchExpress29 {30 int grade;31 public:32 MatchExpress(int grade)33 {34 this -> grade = grade;35 }36 37 bool operator() (Student &s)38 {39 return s.grade > grade;40 }41 };42 43 int main()44 {45 Student s1(1000,"zhangsan",80);46 Student s2(1001,"lisi",85);47 Student s3(1002,"wangwu",80);48 Student s4(1003,"zhaoliu",80);49 50 vector v;51 v.push_back(s1);52 v.push_back(s2);53 v.push_back(s3);54 v.push_back(s4);55 56 int nCount = count_if(v.begin(),v.end(),MatchExpress(80));57 cout << "the counts grade equal to 80 is : " << nCount << endl;58 59 return 0;60 }
4,比较
equal(),mismatch()
template<class Init1,class Init2>
bool equal(Init1 first,Init1 last,Init2 x);
template<class Init1,class Init2,class Pred>
bool equal(Init1 first,Init1 last,Init2 x,Pred pr);
template<class Init1,class Init2>
pair<Init1,Init2>mismatch(Init1 first,Init last,Init2 x);
template<class Init1,class Init2,class Pred>
pair<Init1,Init2>mismatch(Init1 first,Init1 last,Init2 x,Pred pr);
示例:
1>
1 #include2 #include 3 4 using namespace std; 5 6 int main() 7 { 8 int A1[] = { 3,1,4,1,5,9,3}; 9 int A2[] = { 3,1,4,2,8,5,7};10 11 const int N = sizeof(A1)/sizeof(int);12 13 cout << "Result of comparison : " << equal(A1,A1+N,A2) <
2,
1 #include2 #include 3 4 using namespace std; 5 6 int main() 7 { 8 int A1[] = { 3,1,4,1,5,9,3}; 9 int A2[] = { 3,1,4,2,8,5,7};10 11 const int N = sizeof(A1)/sizeof(int);12 13 pair result = mismatch(A1,A1+N,A2);14 15 cout << "The first mismatch is in position " << result.first - A1 << endl;16 cout << "Values are: " << *(result.first) <<"," << *(result.second) << endl;17 18 return 0;19 }
3,
1 #include2 #include 3 #include 4 #include 5 6 using namespace std; 7 8 class Student 9 {10 public:11 int NO;12 string strName;13 int grade;14 15 Student(int NO,string strName,int grade)16 {17 this -> NO = NO;18 this -> strName = strName;19 this -> grade = grade;20 }21 22 bool operator == (Student &s)23 {24 return this->grade == s.grade;25 }26 };27 28 29 int main()30 {31 Student s1(1001,"aaa",90);32 Student s2(1002,"bbb",80);33 Student s3(1003,"ccc",70);34 vector v1;35 v1.push_back(s1);36 v1.push_back(s2);37 v1.push_back(s3);38 39 40 Student s4(1004,"ddd",90);41 Student s5(1005,"eee",80);42 Student s6(1006,"fff",75);43 vector v2;44 v2.push_back(s4);45 v2.push_back(s5);46 v2.push_back(s6);47 48 cout << "Find the first unequal student infomation : " << endl;49 pair result = mismatch(v1.begin(),v1.end(),v2.begin());50 51 Student & stu1 = *result.first;52 Student & stu2 = *result.second;53 54 cout << "ID : " << stu1.NO << "\tname : " << stu1.strName << "\tgrade : "<< stu1.grade << endl;55 cout << "ID : " << stu2.NO << "\tname : " << stu2.strName << "\tgrade : "<< stu2.grade << endl;56 57 return 0;58 }