小言_互联网的博客

C++学习笔记——STL常用算法

429人阅读  评论(0)

常用遍历算法:

for_each

功能:实现遍历容器

函数原型:

for_each(iterator beg, iterator end, _func);
// 遍历算法 遍历容器元素
// beg 开始迭代器
// end 结束迭代器
// _func 函数或者函数对象

例子:


  
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. //普通函数
  6. void print01(int a){
  7. cout<<a<< " ";
  8. }
  9. //函数对象
  10. class print02{
  11. public:
  12. void operator()(int a){
  13. cout<<a<< " ";
  14. }
  15. };
  16. void test01(){
  17. vector< int> v;
  18. for( int i= 0;i< 20;i++){
  19. v.push_back(i);
  20. }
  21. // 遍历
  22. for_each(v.begin(),v.end(),print01);
  23. cout<< endl;
  24. for_each(v.begin(),v.end(),print02());
  25. cout<< endl;
  26. }
  27. int main() {
  28. test01();
  29. return 0;
  30. }

transform

功能:搬运容器到另一个容器中

函数原型:

transform(iterator beg1, iterator end1, iterator beg2, _func);
//beg1 源容器开始迭代器
//end1 源容器结束迭代器
//beg2 目标容器开始迭代器
//_func 函数或者函数对象

例子:


  
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. //函数对象
  6. class print01{
  7. public:
  8. void operator()(int a){
  9. cout<<a<< " ";
  10. }
  11. };
  12. class Transform{
  13. public:
  14. int operator()(int value){
  15. return value;
  16. }
  17. };
  18. void test01(){
  19. vector< int> v;
  20. for( int i= 0;i< 20;i++){
  21. v.push_back(i);
  22. }
  23. // 目标容器
  24. vector< int> v_target;
  25. // 目标容器需要提前开辟空间
  26. v_target.resize(v.size());
  27. transform(v.begin(),v.end(),v_target.begin(),Transform());
  28. for_each(v_target.begin(),v_target.end(),print01());
  29. cout<< endl;
  30. }
  31. int main() {
  32. test01();
  33. return 0;
  34. }

常用查找算法:

find

功能:查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器

函数原型:

find(iterator beg, iterator end, value);
// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
// beg 开始迭代器
// end 结束迭代器
// value 查找的元素

例子:


  
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. class Student{
  6. public:
  7. Student( string name, int age){
  8. this->m_name=name;
  9. this->m_age=age;
  10. }
  11. // 查找自定义数据类型时需要重载==运算符
  12. bool operator==( const Student& student){
  13. if( this->m_name==student.m_name&& this->m_age==student.m_age){
  14. return true;
  15. }
  16. return false;
  17. }
  18. public:
  19. string m_name;
  20. int m_age;
  21. };
  22. void test01(){
  23. Student student1("li",20);
  24. Student student2("wang",16);
  25. Student student3("liu",18);
  26. Student student4("tian",16);
  27. vector<Student> v;
  28. v.push_back(student1);
  29. v.push_back(student2);
  30. v.push_back(student3);
  31. v.push_back(student4);
  32. // 查找指定元素
  33. vector<Student>::iterator it=find(v.begin(),v.end(),student1);
  34. if(it!=v.end()){
  35. cout<< "找到学生"<< endl;
  36. } else{
  37. cout<< "未找到"<< endl;
  38. }
  39. }
  40. int main() {
  41. test01();
  42. return 0;
  43. }

find_if

功能:按照条件查找第一个满足条件的元素

函数原型:

find_if(iterator beg, iterator end, _Pred); 
// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
// beg 开始迭代器
// end 结束迭代器
// _Pred 函数或者谓词(返回bool类型的仿函数)

例子:


  
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. class LessthanEight{
  6. public:
  7. bool operator()(int value){
  8. return value< 8;
  9. }
  10. };
  11. void test01(){
  12. vector< int> v;
  13. for( int i= 0;i< 20;i++){
  14. v.push_back(i);
  15. }
  16. vector< int>::iterator it=find_if(v.begin(),v.end(),LessthanEight());
  17. if(it!=v.end()){
  18. cout<< "找到了小于8的元素:"<<*it<< endl;
  19. } else{
  20. cout<< "未找到"<< endl;
  21. }
  22. }
  23. int main() {
  24. test01();
  25. return 0;
  26. }

adjacent_find

功能:查找相邻重复元素

函数原型:

adjacent_find(iterator beg, iterator end); 
// 查找相邻重复元素,返回相邻元素的第一个位置的迭代器
// beg 开始迭代器
// end 结束迭代器

例子:


  
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. void test01(){
  6. vector< int> v;
  7. v.push_back( 2);
  8. v.push_back( 3);
  9. v.push_back( 3);
  10. v.push_back( 5);
  11. v.push_back( 4);
  12. v.push_back( 4);
  13. vector< int>::iterator it=adjacent_find(v.begin(),v.end());
  14. if(it!=v.end()){
  15. cout<< "找到相邻的重复元素为:"<<*it<< endl;
  16. } else{
  17. cout<< "未找到"<< endl;
  18. }
  19. }
  20. int main() {
  21. test01();
  22. return 0;
  23. }

binary_search

功能:使用二分查找,查找指定元素是否存在,必须在有序序列中使用

函数原型:

bool binary_search(iterator beg, iterator end, value);  
// 查找指定的元素,查到 返回true  否则false
// beg 开始迭代器
// end 结束迭代器
// value 查找的元素

例子:


  
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. void test01(){
  6. vector< int> v;
  7. for( int i= 0;i< 20;i++){
  8. v.push_back(i);
  9. }
  10. // 二分查找
  11. bool ret=binary_search(v.begin(),v.end(), 8);
  12. if(ret){
  13. cout<< "找到了"<< endl;
  14. } else{
  15. cout<< "未找到"<< endl;
  16. }
  17. }
  18. int main() {
  19. test01();
  20. return 0;
  21. }

count

功能:统计元素个数,在统计自定义的数据类型时需要重载==运算符

函数原型:

count(iterator beg, iterator end, value);  
// 统计元素出现次数
// beg 开始迭代器
// end 结束迭代器
// value 统计的元素

例子:


  
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. void test01(){
  6. vector< int> v;
  7. for( int i= 0;i< 20;i++){
  8. v.push_back(i% 2);
  9. }
  10. int num=count(v.begin(),v.end(), 1);
  11. cout<< "1的个数为:"<<num<< endl;
  12. }
  13. int main() {
  14. test01();
  15. return 0;
  16. }

count_if

功能:按照条件统计元素个数

函数原型:

count_if(iterator beg, iterator end, _Pred);  
// 按条件统计元素出现次数
// beg 开始迭代器
// end 结束迭代器
// _Pred 谓词

例子:


  
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. class Less15{
  6. public:
  7. bool operator()(int value){
  8. return value< 15;
  9. }
  10. };
  11. void test01(){
  12. vector< int> v;
  13. for( int i= 0;i< 20;i++){
  14. v.push_back(i);
  15. }
  16. int num=count_if(v.begin(),v.end(),Less15());
  17. cout<< "小于15的个数为:"<<num<< endl;
  18. }
  19. int main() {
  20. test01();
  21. return 0;
  22. }

常用排序算法:

sort

功能:对容器内元素排序,默认从小到大

函数原型:

sort(iterator beg, iterator end, _Pred);
// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
//  beg    开始迭代器
//  end    结束迭代器
// _Pred  谓词

random_shuffle

功能:指定范围内元素随机调整次序,使用的时候要添加随机数种子

函数原型:

random_shuffle(iterator beg, iterator end); 
// 指定范围内的元素随机调整次序
// beg 开始迭代器
// end 结束迭代器

merge

功能:两个容器元素合并,并存储到另一个容器中

函数原型:

merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest); 
// 容器元素合并,并存储到另一容器中
// 注意: 两个容器必须是有序的
// beg1   容器1开始迭代器
// end1   容器1结束迭代器
// beg2   容器2开始迭代器
// end2   容器2结束迭代器
// dest    目标容器开始迭代器

reverse

功能:将容器内元素进行反转

函数原型:

reverse(iterator beg, iterator end); 
// 反转指定范围的元素
// beg 开始迭代器
// end 结束迭代器

例子:


  
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <ctime>
  5. using namespace std;
  6. void print_vector(const vector<int>& v){
  7. for( vector< int>::const_iterator it=v.begin();it!=v.end();it++){
  8. cout<<*it<< " ";
  9. }
  10. cout<< endl;
  11. }
  12. void test01(){
  13. vector< int> v;
  14. v.push_back( 15);
  15. v.push_back( 3);
  16. v.push_back( 45);
  17. v.push_back( 9);
  18. v.push_back( 25);
  19. // sort默认从小到大
  20. sort(v.begin(),v.end());
  21. print_vector(v);
  22. // 从大到小排序
  23. sort(v.begin(),v.end(),greater< int>());
  24. print_vector(v);
  25. }
  26. void test02(){
  27. srand(( unsigned int)time( NULL));
  28. vector< int> v;
  29. for( int i= 0;i< 10;i++){
  30. v.push_back(i);
  31. }
  32. print_vector(v);
  33. // 打乱顺序
  34. random_shuffle(v.begin(),v.end());
  35. print_vector(v);
  36. }
  37. void test03(){
  38. vector< int> v1;
  39. vector< int> v2;
  40. for( int i= 0;i< 10;i++){
  41. v1.push_back(i);
  42. v2.push_back(i+ 1);
  43. }
  44. vector< int> v_dst;
  45. // 目标容器要提前开辟空间
  46. v_dst.resize(v1.size()+v2.size());
  47. // 合并,两个有序序列
  48. merge(v1.begin(),v1.end(),v2.begin(),v2.end(),v_dst.begin());
  49. print_vector(v_dst);
  50. }
  51. void test04(){
  52. vector< int> v;
  53. for( int i= 0;i< 10;i++){
  54. v.push_back(i);
  55. }
  56. cout<< "反转前:"<< endl;
  57. print_vector(v);
  58. cout<< "反转后:"<< endl;
  59. reverse(v.begin(),v.end());
  60. print_vector(v);
  61. }
  62. int main() {
  63. test01();
  64. test02();
  65. test03();
  66. test04();
  67. return 0;
  68. }

常用拷贝和替换算法:

copy

功能:容器内指定范围的元素拷贝到另一个容器中

函数原型:

copy(iterator beg, iterator end, iterator dest); 
// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
// beg  开始迭代器
// end  结束迭代器
// dest 目标起始迭代器

replace

功能:将容器内指定范围的旧元素替换为新元素

函数原型:

replace(iterator beg, iterator end, oldvalue, newvalue);  
// 将区间内旧元素 替换成 新元素
// beg 开始迭代器
// end 结束迭代器
// oldvalue 旧元素
// newvalue 新元素

replace_if

功能:将容器内指定范围满足条件的元素,替换为新元素

函数原型:

replace_if(iterator beg, iterator end, _pred, newvalue); 
// 按条件替换元素,满足条件的替换成指定元素
// beg 开始迭代器
// end 结束迭代器
// _pred 谓词
// newvalue 替换的新元素

swap

功能:互换两个容器的元素

函数原型:

swap(container c1, container c2);  
// 互换两个容器的元素
// c1容器1
// c2容器2

例子:


  
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <ctime>
  5. using namespace std;
  6. void print_vector(const vector<int>& v){
  7. for( vector< int>::const_iterator it=v.begin();it!=v.end();it++){
  8. cout<<*it<< " ";
  9. }
  10. cout<< endl;
  11. }
  12. void test01(){
  13. vector< int> v1;
  14. for( int i= 0;i< 10;i++){
  15. v1.push_back(i);
  16. }
  17. vector< int> v2;
  18. v2.resize(v1.size());
  19. copy(v1.begin(),v1.end(),v2.begin());
  20. print_vector(v2);
  21. }
  22. void test02(){
  23. vector< int> v;
  24. v.push_back( 5);
  25. v.push_back( 2);
  26. v.push_back( 6);
  27. v.push_back( 5);
  28. v.push_back( 4);
  29. cout<< "替换前:"<< endl;
  30. print_vector(v);
  31. cout<< "替换后:"<< endl;
  32. replace(v.begin(),v.end(), 5, 10);
  33. print_vector(v);
  34. }
  35. class Less20{
  36. public:
  37. bool operator()(int value){
  38. return value< 10;
  39. }
  40. };
  41. void test03(){
  42. vector< int> v;
  43. for( int i= 0;i< 20;i++){
  44. v.push_back(i);
  45. }
  46. cout<< "替换前:"<< endl;
  47. print_vector(v);
  48. cout<< "替换后:"<< endl;
  49. replace_if(v.begin(),v.end(),Less20(), 10);
  50. print_vector(v);
  51. }
  52. void test04(){
  53. vector< int> v1;
  54. vector< int> v2;
  55. for( int i= 0;i< 10;i++){
  56. v1.push_back(i);
  57. v2.push_back(i+ 2);
  58. }
  59. cout<< "交换前:"<< endl;
  60. print_vector(v1);
  61. print_vector(v2);
  62. cout<< "交换后:"<< endl;
  63. swap(v1,v2);
  64. print_vector(v1);
  65. print_vector(v2);
  66. }
  67. int main() {
  68. test01();
  69. test02();
  70. test03();
  71. test04();
  72. return 0;
  73. }

常用算术生成算法:

使用时需要包含头文件#include<numeric>

accumulate

功能:计算区间内容器元素累计之和

函数原型:

accumulate(iterator beg, iterator end, value);  
// 计算容器元素累计总和
// beg 开始迭代器
// end 结束迭代器
// value 起始值

fill

功能:向容器中填充指定的元素

函数原型:

fill(iterator beg, iterator end, value);  
// 向容器中填充元素
// beg 开始迭代器
// end 结束迭代器
// value 填充的值

例子:


  
  1. #include <iostream>
  2. #include <numeric>
  3. #include <algorithm>
  4. #include <vector>
  5. using namespace std;
  6. class MyPrint{
  7. public:
  8. void operator()(int value){
  9. cout<<value<< " ";
  10. }
  11. };
  12. void test01(){
  13. vector< int> v1;
  14. for( int i= 0;i< 1000;i++){
  15. v1.push_back(i);
  16. }
  17. // 求和
  18. int sum=accumulate(v1.begin(),v1.end(), 0);
  19. cout<< "sum= "<<sum<< endl;
  20. vector< int> v2;
  21. v2.resize( 20);
  22. // 填充
  23. fill(v2.begin(),v2.end(), 10);
  24. for_each(v2.begin(),v2.end(),MyPrint());
  25. }
  26. int main() {
  27. test01();
  28. return 0;
  29. }

常用集合算法:

set_intersection

功能:求两个集合的交集

函数原型:

set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);  
// 求两个集合的交集
// **注意:两个集合必须是有序序列**
// beg1 容器1开始迭代器
// end1 容器1结束迭代器
// beg2 容器2开始迭代器
// end2 容器2结束迭代器
// dest 目标容器开始迭代器

set_union

功能:求两个集合的并集

函数原型:

set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);  
// 求两个集合的并集
// **注意:两个集合必须是有序序列**
// beg1 容器1开始迭代器
// end1 容器1结束迭代器
// beg2 容器2开始迭代器
// end2 容器2结束迭代器
// dest 目标容器开始迭代器

set_difference

功能:求两个集合的差集

函数原型:

set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);  
// 求两个集合的差集
// **注意:两个集合必须是有序序列**
// beg1 容器1开始迭代器
// end1 容器1结束迭代器
// beg2 容器2开始迭代器
// end2 容器2结束迭代器
// dest 目标容器开始迭代器

例子:


  
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. class MyPrint{
  6. public:
  7. void operator()(int value){
  8. cout<<value<< " ";
  9. }
  10. };
  11. //交集
  12. void test01(){
  13. vector< int> v1;
  14. vector< int> v2;
  15. for( int i= 0;i< 10;i++){
  16. v1.push_back(i);
  17. v2.push_back(i+ 2);
  18. }
  19. cout<< "v1:"<< endl;
  20. for_each(v1.begin(),v1.end(),MyPrint());
  21. cout<< endl;
  22. cout<< "v2:"<< endl;
  23. for_each(v2.begin(),v2.end(),MyPrint());
  24. cout<< endl;
  25. vector< int> v_dst;
  26. // 取两个里面较小的值给目标容器开辟空间
  27. v_dst.resize(min(v1.size(),v2.size()));
  28. // 返回目标容器的最后一个元素的迭代器地址
  29. vector< int>::iterator it=set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),v_dst.begin());
  30. cout<< "v1和v2的交集:"<< endl;
  31. for_each(v_dst.begin(),it,MyPrint());
  32. cout<< endl;
  33. }
  34. //并集
  35. void test02(){
  36. vector< int> v1;
  37. vector< int> v2;
  38. for( int i= 0;i< 10;i++){
  39. v1.push_back(i);
  40. v2.push_back(i+ 2);
  41. }
  42. cout<< "v1:"<< endl;
  43. for_each(v1.begin(),v1.end(),MyPrint());
  44. cout<< endl;
  45. cout<< "v2:"<< endl;
  46. for_each(v2.begin(),v2.end(),MyPrint());
  47. cout<< endl;
  48. vector< int> v_dst;
  49. // 取两个的和给目标容器开辟空间
  50. v_dst.resize(v1.size()+v2.size());
  51. // 返回目标容器的最后一个元素的迭代器地址
  52. vector< int>::iterator it=set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),v_dst.begin());
  53. cout<< "v1和v2的并集:"<< endl;
  54. for_each(v_dst.begin(),it,MyPrint());
  55. cout<< endl;
  56. }
  57. //差集
  58. void test03(){
  59. vector< int> v1;
  60. vector< int> v2;
  61. for( int i= 0;i< 10;i++){
  62. v1.push_back(i);
  63. v2.push_back(i+ 2);
  64. }
  65. cout<< "v1:"<< endl;
  66. for_each(v1.begin(),v1.end(),MyPrint());
  67. cout<< endl;
  68. cout<< "v2:"<< endl;
  69. for_each(v2.begin(),v2.end(),MyPrint());
  70. cout<< endl;
  71. vector< int> v_dst;
  72. // 取两个的较大值给目标容器开辟空间
  73. v_dst.resize(max(v1.size(),v2.size()));
  74. // 返回目标容器的最后一个元素的迭代器地址
  75. vector< int>::iterator it1=set_difference(v1.begin(),v1.end(),v2.begin(),v2.end(),v_dst.begin());
  76. cout<< "v1和v2的差集:"<< endl;
  77. for_each(v_dst.begin(),it1,MyPrint());
  78. cout<< endl;
  79. vector< int>::iterator it2=set_difference(v2.begin(),v2.end(),v1.begin(),v1.end(),v_dst.begin());
  80. cout<< "v2和v1的差集:"<< endl;
  81. for_each(v_dst.begin(),it2,MyPrint());
  82. cout<< endl;
  83. }
  84. int main() {
  85. test01();
  86. test02();
  87. test03();
  88. return 0;
  89. }

 


转载:https://blog.csdn.net/m0_37772527/article/details/104627430
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场