c++基础:8.3_STL算法

文章目录

  • (***)1.遍历(for_each(),仿函数,lambda函数,全局函数)
  • (***)2.最值+定位
    • 2.1 max(a,b), min(a,b)
    • 2.2 max_element(can.begin(),can.end()),min_element(),distance(can.begin(),pointer)
    • 2.3 完整代码
  • (***)3.排序+翻转
    • 3.1 基础
    • 3.2 面试应用
      • 3.2.1 (344)翻转字符串
      • 3.2.2 (面试题40)最小的K个数
      • 3.2.3 (148)排序链表
  • (***)4.查找+计数
    • 4.1 常见操作
    • 4.2 实际案例
      • 4.2.1 (704)二分查找
      • 4.2.2 (53-1)在排序数组中查找数字
      • 4.2.3 (1351)统计有序矩阵中的负数
  • (***)5.累加+转化
    • 5.1 常见操作
    • 5.2 实际案例
      • 5.2.1 (386)字典树排序
      • 5.2.2 (53-2)0-n-1缺乏的数字
  • (***)6.有序操作
    • (***)6.1基础应用
    • 6.2 实际应用
      • 6.2.1 (34)在排序数组中查找元素的第一个和最后一个位置
      • 6.2.2 (704)二分查找
  • (***)7.复制+移除+替换
    • 7.1 copy(),copy_backward();
    • 7.2 remove(),remove_if();
    • 7.3 replace();
    • 7.4(完整代码)
  • 8.标准
    • 8.1构成
    • 8.2 分类
    • 8.3 填充
    • 8.4 遍历/变换
    • 8.5 最大最小
    • 8.6 排序算法(12个):提供元素排序策略
      • 1 排序
      • 2 反转/旋转
      • 3 随机
    • 8.7 查找算法(13个):判断容器中是否包含某个值
      • 1 统计
      • 2 查找
      • 3 搜索
      • 4 边界
    • 8.8 删除和替换算法(15个)
      • 复制
      • 移除
      • 替换
      • 去重
      • 交换
    • 8.9 算术算法(4个)``
    • 8.10 关系算法(4个)
    • 8.11集合算法(6个)
    • 8.12排列组合算法(2个):提供计算给定集合按一定顺序的所有可能排列组合
    • 8.13堆算法(4个)

(***)1.遍历(for_each(),仿函数,lambda函数,全局函数)

(1)全局函数在容器中加入,不用带参数;

 for_each(vec.begin(),vec.end(),Display);  //1.全局函数在容器中加入,不用带参数;

(2) 仿函数在容器中加入,不用带参数;

 for_each(vec.begin(),vec.end(),CDisplay());  //2.仿函数在容器中加入,不用带参数;

(3)lamabda函数在容器中加入,带参数; //a.lamabda()表达式和仿函数无关

for_each(vec.begin(),vec.end(),[](int(n)){
       //3.lamabda函数在容器中加入,带参数; //a.lamabda()表达式和仿函数无关
             cout<<n<<"\t";});

(完整代码 001_for_each.cpp)

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

class CDisplay{
   
public:
    void operator()(int n){
   
    cout << n << "\t";
    }
};

    void Display(int n){
   
        cout << n << "\t";
    }

int main()
{
   
    vector<int> vec{
   1,2,3,4,5,6};
    for_each(vec.begin(),vec.end(),Display);  //1.全局函数在容器中加入,不用带参数;
    cout << endl;
    for_each(vec.begin(),vec.end(),CDisplay());  //2.仿函数在容器中加入,不用带参数;
    cout << endl;
     for_each(vec.begin(),vec.end(),[](int(n)){
       //3.lamabda函数在容器中加入,带参数; //a.lamabda()表达式和仿函数无关
             cout<<n<<"\t";});
    cout << endl;

    cout << "----------------------"<<endl;
    list<int> li{
   11,12,13,14,15,16};
    for_each(li.begin(),li.end(),Display);  //1.全局函数在容器中加入,不用带参数;
    cout << endl;
    for_each(li.begin(),li.end(),CDisplay());  //2.成员函数在容器中加入,不用带参数;
    cout << endl;


    cout << "----------------------"<<endl;
    set<int> s{
   31,32,33,34,35,36};
    for_each(s.begin(),s.end(),Display);  //1.全局函数在容器中加入,不用带参数;
    cout << endl;
    for_each(s.begin(),s.end(),CDisplay());  //2.成员函数在容器中加入,不用带参数;
    cout << endl;

     cout << "----------------------"<<endl;
    map<int,string> records{
   
    {
   1,"张三"},   {
   2,"李四"},   {
   3,"王五"}
    };

    for_each(records.begin(),records.end(),[](pair<int,string> p){
   
             cout<<p.first <<"\t"<<p.second<<endl;});
   




    return 0;
}

(***)2.最值+定位

2.1 max(a,b), min(a,b)

查找数组,字符串数组的最小值,注意比较对象max(a,b);

 cout << max(1.2,1.3)<< endl;
    cout << min("abc","abd")<< endl;//查找数组,字符串数组的最小值,注意比较对象max(a,b);

2.2 max_element(can.begin(),can.end()),min_element(),distance(can.begin(),pointer)

(1)distance获取顺序容器中的最值,注意解引用;
采用迭代器的方式(auto查找)

 list<double> l{
   1.1,1.2,1.3};
    auto max_it = max_element(l.begin(),l.end());
    cout << distance(l.begin(),max_it) << "\t" << *max_it << endl;
    auto min_it = min_element(l.begin(),l.end());
    cout << distance(l.begin(),min_it) << "\t" << *min_it << endl;

2.3 完整代码

(完整代码见002_max_min.cpp)

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;


int main()
{
   

    cout << max(1.2,1.3)<< endl;
    cout << min("abc","abd")<< endl;//查找数组,字符串数组的最小值,注意比较对象max(a,b);
    //获取顺序容器中的最值,注意解引用;
    list<double> l{
   1.1,1.2,1.3};
    auto max_it = max_element(l.begin(),l.end());
    cout << distance(l.begin(),max_it) << "\t" << *max_it << endl;
    auto min_it = min_element(l.begin(),l.end());
    cout << distance(l.begin(),min_it) << "\t" << *min_it << endl;

    return 0;
}

(***)3.排序+翻转

3.1 基础

a.容器对象:vector,deque,默认升序

sort(vec.begin(),vec.end()

你可能感兴趣的:(3.1,c++大神进阶(基础篇))