zoukankan      html  css  js  c++  java
  • algorithm头文件的一些常用函数

    首先当然要包含algorithm头文件 :#include <algorithm>

    • max(x,y) min(x,y) 参数可以是浮点数
    • abs(x) x必须是整数 如果x是浮点数则要用math头文件下的fabs(x)
    • swap(x,y) 交换x和y
    • reverse(it,it2) it和it2可以是数组指针,也可以是容器的迭代器 注意的是翻转范围为:[it,it2)
    • next_permutation() 给出一个序列在全排列中的下一个序列
    int box[3]={1,2,3};
    do{
        for(int i=0;i<3;++i)
            cout << box[i] << ' ';
        cout << endl;
    }while(next_permutation(box,box+3));
    • fill() 与memset不同,fill赋值可以是数组类型对应范围中的任意值,因为string.h头文件中的memset中是按字节来赋值,因此往往只能赋值0或者-1而且速度比fill速度快
    int box[5];
    fill(box,box+5,123);
    for(int i=0;i<5;++i)
        cout << box[i] << ' ';
    cout << endl;
    • lower_bound(first,last,value)、upper_bound(first,last,value),他们都要在一个有序数组或有序容器中使用,lower_bound在[first,last)中找第一个值大于等于value的元素的位置,upper_bound在[first,last)中找第一个值大于value的元素的位置,所以返回的是数组的指针或者是容器的迭代器,当然只要减去了首地址得到的也就是目标元素的下标了。 时间复杂度均为:$O(log(last-first))$
    • sort() sort根据具体情况会使用不同的排序方法,而且规避了传统快速排序中可能会出现的复杂度退化到$O(N^2)$的情况(那就跟冒泡排序差不多了,效率差)。
      • sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填)) 例如sort(v.begin(),v.end())
      • 只有vector、string、deque是可以使用sort,因为set、map这种容器是用红黑树实现的,他们本身就是有序的了
      • 如果比较的对象是基本数据类型,那么比较函数可以默认不填(默认是递增顺序,如果我们要改变为递减也是要重写比较函数的),但如果对象是结构体,那么必须由我们来写一个比较函数出来作为排序依据:
    bool cmp(int a,int b) //改写为按递减顺序来排序 
    {
        return a > b;
    }
    
    struct node
    {
        int x;
        int y;
    };
    
    bool cmp(node a,node b) // 结构体的比较函数 
    {
        if(a.x!=b.x)
        {
            return a.x > b.x;
        }
        else
        {
            return a.y < b.y;
        }
    }
  • 相关阅读:
    NSInvocation 回调使用
    C#控制台源程序分享
    HTML 表单控件的汇总
    学习笔记(2):HTML 常用标签的归纳
    学习笔记(4):C#中的正则简单总结
    学习笔记(5):DIV+CSS 经典盒子模型 积累
    学习笔记(3):sql语句的总结
    毕业一年小结
    头文件方法问题
    百度被黑事件
  • 原文地址:https://www.cnblogs.com/kachunyippp/p/10256705.html
Copyright © 2011-2022 走看看