3 常用排序算法
1. - sort //对容器内元素进行排序 2. 3. - random_shuffle //洗牌 指定范围内的元素随机调整次序 4. 5. - merge // 容器元素合并,并存储到另一容器中 6. 7. - reverse // 反转指定范围的元素
3.1 sort
**功能描述:**
* 对容器内元素进行排序
**函数原型:**
1. - sort(iterator beg, iterator end, _Pred); 2. // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置 3. // beg 开始迭代器 4. // end 结束迭代器 5. // _Pred 谓词
1. #include <algorithm> 2. #include <vector> 3. 4. void myPrint(int val) 5. { 6. cout << val << " "; 7. } 8. 9. void test01() { 10. vector<int> v; 11. v.push_back(10); 12. v.push_back(30); 13. v.push_back(50); 14. v.push_back(20); 15. v.push_back(40); 16. 17. //sort默认从小到大排序 18. sort(v.begin(), v.end()); 19. for_each(v.begin(), v.end(), myPrint); 20. cout << endl; 21. 22. //从大到小排序 23. sort(v.begin(), v.end(), greater<int>()); 24. for_each(v.begin(), v.end(), myPrint); 25. cout << endl; 26. } 27. 28. int main() 29. { 30. test01(); 31. return 0; 32. }
**总结:**sort属于开发中最常用的算法之一,需熟练掌握
3.2 random_shuffle
**功能描述:**
* 洗牌 指定范围内的元素随机调整次序
**函数原型:**
1. - random_shuffle(iterator beg, iterator end); 2. // 指定范围内的元素随机调整次序 3. // beg 开始迭代器 4. // end 结束迭代器
1. #include <algorithm> 2. #include <vector> 3. #include <ctime> 4. 5. class myPrint 6. { 7. public: 8. void operator()(int val) 9. { 10. cout << val << " "; 11. } 12. }; 13. 14. void test01() 15. { 16. srand((unsigned int)time(NULL)); 17. vector<int> v; 18. for(int i = 0 ; i < 10;i++) 19. { 20. v.push_back(i); 21. } 22. for_each(v.begin(), v.end(), myPrint()); 23. cout << endl; 24. 25. //打乱顺序 26. random_shuffle(v.begin(), v.end()); 27. for_each(v.begin(), v.end(), myPrint()); 28. cout << endl; 29. } 30. 31. int main() { 32. test01(); 33. return 0; 34. }
**总结:**random_shuffle洗牌算法比较实用,使用时记得加随机数种子
3.3 merge
**功能描述:**
* 两个容器元素合并,并存储到另一容器中
**函数原型:**
1. - merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest); 2. // 容器元素合并,并存储到另一容器中 3. // 注意: 两个容器必须是**有序的** 4. // beg1 容器1开始迭代器 5. // end1 容器1结束迭代器 6. // beg2 容器2开始迭代器 7. // end2 容器2结束迭代器 8. // dest 目标容器开始迭代器
1. #include <algorithm> 2. #include <vector> 3. 4. class myPrint 5. { 6. public: 7. void operator()(int val) 8. { 9. cout << val << " "; 10. } 11. }; 12. 13. void test01() 14. { 15. vector<int> v1; 16. vector<int> v2; 17. for (int i = 0; i < 10 ; i++) 18. { 19. v1.push_back(i); 20. v2.push_back(i + 1); 21. } 22. 23. vector<int> vtarget; 24. //目标容器需要提前开辟空间 25. vtarget.resize(v1.size() + v2.size()); 26. //合并 需要两个有序序列 27. merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vtarget.begin()); 28. for_each(vtarget.begin(), vtarget.end(), myPrint()); 29. cout << endl; 30. } 31. 32. int main() { 33. test01(); 34. return 0; 35. }
**总结:**merge合并的两个容器必须的有序序列
3.4 reverse
**功能描述:**
* 将容器内元素进行反转
**函数原型:**
1. - reverse(iterator beg, iterator end); 2. // 反转指定范围的元素 3. // beg 开始迭代器 4. // end 结束迭代器
1. #include <algorithm> 2. #include <vector> 3. 4. class myPrint 5. { 6. public: 7. void operator()(int val) 8. { 9. cout << val << " "; 10. } 11. }; 12. 13. void test01() 14. { 15. vector<int> v; 16. v.push_back(10); 17. v.push_back(30); 18. v.push_back(50); 19. v.push_back(20); 20. v.push_back(40); 21. 22. cout << "反转前: " << endl; 23. for_each(v.begin(), v.end(), myPrint()); 24. cout << endl; 25. 26. cout << "反转后: " << endl; 27. 28. reverse(v.begin(), v.end()); 29. for_each(v.begin(), v.end(), myPrint()); 30. cout << endl; 31. } 32. 33. int main() { 34. test01(); 35. return 0; 36. }
**总结:**reverse反转区间内元素,面试题可能涉及到
4 常用拷贝和替换算法
1. - copy // 容器内指定范围的元素拷贝到另一容器中 2. - replace // 将容器内指定范围的旧元素修改为新元素 3. - replace_if // 容器内指定范围满足条件的元素替换为新元素 4. - swap // 互换两个容器的元素
4.1 copy
**功能描述:**
* 容器内指定范围的元素拷贝到另一容器中
**函数原型:**
1. - copy(iterator beg, iterator end, iterator dest); 2. // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置 3. // beg 开始迭代器 4. // end 结束迭代器 5. // dest 目标起始迭代器
1. #include <algorithm> 2. #include <vector> 3. 4. class myPrint 5. { 6. public: 7. void operator()(int val) 8. { 9. cout << val << " "; 10. } 11. }; 12. 13. void test01() 14. { 15. vector<int> v1; 16. for (int i = 0; i < 10; i++) { 17. v1.push_back(i + 1); 18. } 19. vector<int> v2; 20. v2.resize(v1.size()); 21. copy(v1.begin(), v1.end(), v2.begin()); 22. 23. for_each(v2.begin(), v2.end(), myPrint()); 24. cout << endl; 25. } 26. 27. int main() { 28. test01(); 29. return 0; 30. }
**总结:**利用copy算法在拷贝时,目标容器记得提前开辟空间
4.2 replace
**功能描述:**
* 将容器内指定范围的旧元素修改为新元素
**函数原型:**
1. - replace(iterator beg, iterator end, oldvalue, newvalue); 2. // 将区间内旧元素 替换成 新元素 3. // beg 开始迭代器 4. // end 结束迭代器 5. // oldvalue 旧元素 6. // newvalue 新元素
1. #include <algorithm> 2. #include <vector> 3. 4. class myPrint 5. { 6. public: 7. void operator()(int val) 8. { 9. cout << val << " "; 10. } 11. }; 12. 13. void test01() 14. { 15. vector<int> v; 16. v.push_back(20); 17. v.push_back(30); 18. v.push_back(20); 19. v.push_back(40); 20. v.push_back(50); 21. v.push_back(10); 22. v.push_back(20); 23. 24. cout << "替换前:" << endl; 25. for_each(v.begin(), v.end(), myPrint()); 26. cout << endl; 27. 28. //将容器中的20 替换成 2000 29. cout << "替换后:" << endl; 30. replace(v.begin(), v.end(), 20,2000); 31. for_each(v.begin(), v.end(), myPrint()); 32. cout << endl; 33. } 34. 35. int main() { 36. test01(); 37. return 0; 38. }
**总结:**replace会替换区间内满足条件的元素
4.3 replace_if
**功能描述:**
* 将区间内满足条件的元素,替换成指定元素
**函数原型:**
1. - replace_if(iterator beg, iterator end, _pred, newvalue); 2. // 按条件替换元素,满足条件的替换成指定元素 3. // beg 开始迭代器 4. // end 结束迭代器 5. // _pred 谓词 6. // newvalue 替换的新元素
1. #include <algorithm> 2. #include <vector> 3. 4. class myPrint 5. { 6. public: 7. void operator()(int val) 8. { 9. cout << val << " "; 10. } 11. }; 12. 13. class ReplaceGreater30 14. { 15. public: 16. bool operator()(int val) 17. { 18. return val >= 30; 19. } 20. 21. }; 22. 23. void test01() 24. { 25. vector<int> v; 26. v.push_back(20); 27. v.push_back(30); 28. v.push_back(20); 29. v.push_back(40); 30. v.push_back(50); 31. v.push_back(10); 32. v.push_back(20); 33. 34. cout << "替换前:" << endl; 35. for_each(v.begin(), v.end(), myPrint()); 36. cout << endl; 37. 38. //将容器中大于等于的30 替换成 3000 39. cout << "替换后:" << endl; 40. replace_if(v.begin(), v.end(), ReplaceGreater30(), 3000); 41. for_each(v.begin(), v.end(), myPrint()); 42. cout << endl; 43. } 44. 45. int main() { 46. test01(); 47. return 0; 48. }
**总结:**replace_if按条件查找,可以利用仿函数灵活筛选满足的条件