img
5.1 常用遍历算法
img
for_each
for_each(iterator beg, iterator end,_func)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 void print01 (int val) { cout << val << " " ; }class print02 {public : void operator () (int val) { cout << val << " " ; } };void test01 () { vector<int > v; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } for_each(v.begin (), v.end (), print01); cout << endl; for_each(v.begin (), v.end (), print02 ()); cout << endl; }
img
搬运要提前开辟空间,否则无法搬运
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class TransForm {public : int operator () (int v) { return v; } };void test02 () { vector<int > v; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } vector<int > t; t.resize (v.size ()); transform (v.begin (), v.end (), t.begin (),TransForm ()); for_each(t.begin (), t.end (), print02 ()); }
img
5.2 常用查找算法
img
5.2.1 find
img
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 void test03 () { vector<int > v; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } vector<int >::iterator it = find (v.begin (), v.end (), 5 ); if (it == v.end ()) { cout << "don't" << endl; } else { cout << *it << endl; } for_each(v.begin (), v.end (), print02 ()); }class Person {public : Person (string mn, int ma) :name (mn), age (ma) {} bool operator ==(const Person&p) { if (this ->name == p.name && this ->age ==p.age) { return true ; } return false ; } string name; int age; };void test04 () { vector<Person> v; Person p1 ("a" , 10 ) ; Person p2 ("b" , 20 ) ; Person p3 ("c" , 30 ) ; Person p4 ("d" , 40 ) ; v.push_back (p1); v.push_back (p2); v.push_back (p3); v.push_back (p4); Person pp ("b" , 20 ) ; vector<Person>::iterator it = find (v.begin (), v.end (), pp); if (it == v.end ()) { cout << "no" << endl; } else { cout << it->age << " " << it->name << endl; } }
5.2.2 find_if
img
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 class GreaterFive {public : bool operator () (int val) { return val > 5 ; } };void test06 () { vector<int > v; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } vector<int >::iterator it = find_if (v.begin (), v.end (), GreaterFive ()); if (it == v.end ()) { cout << "don't" << endl; } else { cout << *it << endl; } for_each(v.begin (), v.end (), print02 ()); }
5.2.3 adjacant_find
img
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 void test07 () { vector<int > v; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } v.push_back (9 ); vector<int >::iterator it = adjacent_find (v.begin (), v.end ()); if (it == v.end ()) { cout << "don't" << endl; } else { cout << *it << endl; } for_each(v.begin (), v.end (), print02 ()); }
5.2.4 binary_search
img
1 2 3 4 5 6 7 8 9 10 11 void test08 () { vector<int > v; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } cout << binary_search (v.begin (), v.end (),9 ) << endl; for_each(v.begin (), v.end (), print02 ()); }
5.2.5 count
img
要重载 ==
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class Person2 {public : Person2 (string mn, int ma) :name (mn), age (ma) {} bool operator ==(const Person2& p) { if (this ->age == p.age) { return true ; } return false ; } string name; int age; };void test10 () { vector<Person2> v; Person2 p ("zhang" , 10 ) ; for (int i = 0 ; i < 10 ; i++) { v.push_back (p); } Person2 p2 ("zhang" , 10 ) ; cout << count (v.begin (), v.end (), p2) << endl;
5.2.6 count_if
img
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 void test11 () { vector<int > v; for (int i = 0 ; i < 10 ; i++) { v.push_back (20 ); } cout << count_if (v.begin (), v.end (), GreaterFive ()) << endl; for_each(v.begin (), v.end (), print02 ()); }class Person3 {public : Person3 (string mn, int ma) :name (mn), age (ma) {} string name; int age; };class Less20 {public : bool operator () (const Person3& p) { if (p.age < 20 ) return true ; return false ; } };void test12 () { vector<Person3> v; Person3 p ("zhang" , 10 ) ; for (int i = 0 ; i < 10 ; i++) { v.push_back (p); } cout << count_if (v.begin (), v.end (), Less20 ()) << endl; }
5.3 常用排序算法
img
5.3.1 sort
img
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 void test13 () { vector<int > v; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } v.push_back (-2 ); for_each(v.begin (), v.end (), print02 ()); cout << endl; sort (v.begin (), v.end ()); for_each(v.begin (), v.end (), print02 ()); cout << endl; sort (v.begin (), v.end (), greater <int >()); for_each(v.begin (), v.end (), print02 ()); cout << endl; }
5.3.2 random_shuffle
img
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 void test14 () { srand ((unsigned int )time (NULL )); vector<int > v; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } v.push_back (-2 ); for_each(v.begin (), v.end (), print02 ()); cout << endl; random_shuffle (v.begin (), v.end ()); for_each(v.begin (), v.end (), print02 ()); cout << endl; }
5.3.3 merge
img
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 void test15 () { vector<int > v; vector<int > t; vector<int > vt; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } for (int i = 0 ; i < 10 ; i++) { t.push_back (i+1 ); } vt.resize (v.size () + t.size ()); merge (v.begin (), v.end (), t.begin (), t.end (), vt.begin ()); for_each(vt.begin (), vt.end (), print02 ()); cout << endl; }
5.3.4 reverse
img
1 2 3 4 5 6 7 8 9 10 11 12 13 void test16 () { vector<int > v; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } reverse (v.begin (), v.end ()); for_each(v.begin (), v.end (), print02 ()); cout << endl; }
5.4 常用拷贝和替换算法
img
5.4.1 copy
img
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 void test17 () { vector<int > v; vector<int > t; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } t.resize (v.size ()); copy (v.begin (), v.end (),t.begin ()); for_each(t.begin (), t.end (), print02 ()); cout << endl; }
5.4.2 replace
img
1 2 3 4 5 6 7 8 9 10 11 12 void test18 () { vector<int > v; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } replace (v.begin (), v.end (), 9 ,10 ); for_each(v.begin (), v.end (), print02 ()); cout << endl; }
5.4.3 replace_if
img
1 2 3 4 5 6 7 8 9 10 11 12 13 14 void test18 () { vector<int > v; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } replace_if (v.begin (), v.end (), GreaterFive (), 10 ); for_each(v.begin (), v.end (), print02 ()); cout << endl; }
5.4.4 swap
img
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 void test20 () { vector<int > v; vector<int > t; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } for (int i = 0 ; i < 10 ; i++) { t.push_back (i*2 ); } swap (v, t); for_each(v.begin (), v.end (), print02 ()); cout << endl; for_each(t.begin (), t.end (), print02 ()); cout << endl; }
5.5 常用算术生成算法
img
5.5.1accumulate
img
1 2 3 4 5 6 7 8 9 10 11 12 13 void test21 () { vector<int > v; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } int total = accumulate (v.begin (),v.end (),0 ); for_each(v.begin (), v.end (), print02 ()); cout << endl; cout << total << endl; }
5.5.2 fill
img
1 2 3 4 5 6 7 8 9 10 11 12 void test22 () { vector<int > v; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } fill (v.begin (), v.end (), 20 ); for_each(v.begin (), v.end (), print02 ()); cout << endl; }
5.6常用集合算法
img
5.6.1 set intersection
img
返回值为交集最后一个元素的指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 void test23 () { vector<int > v; vector<int > t; vector<int > vt; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } for (int i = 0 ; i < 10 ; i++) { t.push_back (i + 5 ); } vt.resize (min (v.size (), t.size ())); vector<int >::iterator it = set_intersection (v.begin (), v.end (), t.begin (), t.end (), vt.begin ()); for_each(vt.begin (), it, print02 ()); cout << endl; }
5.6.2 set_union
img
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 void test24 () { vector<int > v; vector<int > t; vector<int > vt; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } for (int i = 0 ; i < 10 ; i++) { t.push_back (i + 5 ); } vt.resize ((v.size ()+t.size ())); vector<int >::iterator it = set_union (v.begin (), v.end (), t.begin (), t.end (), vt.begin ()); for_each(vt.begin (), it, print02 ()); cout << endl; }
5.6.3 set_diffrence
img
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 void test25 () { vector<int > v; vector<int > t; vector<int > vt; for (int i = 0 ; i < 10 ; i++) { v.push_back (i); } for (int i = 0 ; i < 10 ; i++) { t.push_back (i + 5 ); } vt.resize (max (v.size () , t.size ())); vector<int >::iterator it = set_difference (v.begin (), v.end (), t.begin (), t.end (), vt.begin ()); for_each(vt.begin (), it, print02 ()); cout << endl; }