algorithm用法详解

标准库模板: Algorithms

头文件<algorithm>定义了一系列特别设计用于元素范围的函数。

范围是可以通过迭代器或指针访问的任何对象序列,例如数组或某些STL 容器的实例。但请注意,算法直接通过迭代器对值进行操作,不会以任何方式影响任何可能容器的结构(它永远不会影响容器的大小或存储分配)。


在开始之前,首先介绍下一些模板的知识,本文在介绍具体函数之前,先把函数总览列了出来,如果读者不想看全部内容,可以检索定位到自己喜欢的函数,直接查看。在查看本文章之前需要读者具备一定的 vector 知识。本文作者只写了algorithm 中常用的一些函数,如果读者有其他需要,可以在博客中留言,博主会为读者添加

vector 参考链接: https://blog.csdn.net/qq_41291253/article/details/89840185 

函数模板与类模板

模板是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了代码的重用。所谓函数模板,实际上就是建立一个通用函数,其函数返回类型形参类型不具体制定,用一个虚拟的类型来代表。

函数模板声明格式如下:

template <typename/class 类型参数>
   返回类型 函数名(模板形参表)
{
    函数体
}

//求最大值函数 max()定义成函数模板
template <typename T>
   T max(T x, T y)
{   return(x > y) ? x : y;  }

//使用方式,直接函数名调用
int x1, y1;
double x2, y2;
max(x1, y1);
max(x2, y2);

类模板

template <class 类型参数>
class 类名
{
    类成员声明
};

//求三个数之和
template <class T>
   class Three
{
    public::
        Three(T a, T b, T c)
        { x = a; y = b; z = c;}
        T sum()
        { return x + y + z;}
    private:
        T x, y, z;
};

//使用方式,
类模板名<实际类型名>对象名;
类模板名<实际对象名>对象名(实参表列);
Three<int> sum3(3, 5, 7);

函数总览:

一、非修改序列函数

1.for_each

将函数fn应用于[first,last)范围中的每个元素

2.find

[first,last)范围内比较元素值是否等于val并返回第一个等于 val元素的迭代器

3.find_if

返回在[first,last]范围中的元素传入pred函数中返回true的第一个元素的迭代器

4.search

搜索[first1,last1)定义的范围中第一次出现[first2,last2)序列,并将迭代器返回到其第一个元素

5.find_end

搜索[first1,last1)定义的范围中最后一次出现[first2,last2)序列,并将迭代器返回到其第一个元素

6.count

计算[first, last)范围内等于 val 值的元素数

7.count_if

在[first1,last1)范围内返回满足 pred函数条件的元素总数

8.search_n

在[first, last)范围内搜索最小连续元素(count)都等于val值的第一个元素的迭代器

二、修改序列函数

1.copy 复制范围内的元素
2.swap 交换两个对象的值

3.swap_rangs

交换两个范围的元素
4.reverse  反向范围
5.replace 替换范围中的元素
6.replace_if 根据条件替换范围中的元素
7.remove 从范围中删除元素
8.remove_if 根据条件从范围中删除元素
9.unique 删除范围内的连续重复项

三、分区

四、排序

1.sort 排序范围内的元素
2.stable_sort 将范围中的元素[first,last)按升序排序,如sort,但stable_sort保留值相等的元素的相对顺序

五、二进制搜索

六、合并

七、堆

八、最大/最小

1.max 返回两个值中的最大值(功能模板:int i , j ;  max(i , j);)
2.min 返回两个值中的最小值

3.max_element

返回范围内的最大值
4.min_element 返回范围内的最小值

九、其他


为方便读者检索,可以点击需要查看的函数直接定位

 

目录

一、非修改序列函数

1.for_each:--> 2.find:--> 3.find_if:--> 4.search(-find_end):--> 5.find_end:--> 6.count:--> 7.count_if:--> 8.search_n:

二、修改序列函数

1.copy:--> 2.swap:--> 3.swap_rangs--> 4.reverse:--> 5.replace--> 6.replace_if--> 7.remove--> 8.remove_if

四、排序

1.sort:--> 2.stable_sort:

八、最大/最小

1.max_element / min_element


函数详解:

一、非修改序列函数

1.for_each:

将函数fn应用于[first,last)范围中的每个元素。

/*==================================================
注:fn为一元函数,该函数接受范围内的元素作为参数
    InputIterator Function是参数类型,可变(数组指针,迭代器)
    Function是返回类型,可变。
    for_each 是函数名,不可变
    使用时直接采用函数名+变量的形式进行实例化调用
==================================================*/
template <class InputIterator, class Function>   
   Function for_each (InputIterator first, InputIterator last, Function fn)   
{
  while (first != last) 
    {
        fn (*first);
        ++first;
    }
  return fn;      // or, since C++11: return move(fn);
}

函数用例

/*==================================================================
 函数操作:for_each()
 函数形参:将迭代器输入到序列中的初始位置和最终位置。使用的范围是[first,last).
         fn-函数指针或move constructible函数对象
 函数返回:返回 fn
 =================================================================*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void myfunction(int i){
    cout << ' ' << i;
}

struct myclass{
    void operator()(int i){
        cout << ' ' << i;
    }
}myobject;

int main()
{
    vector<int> myvector;
    myvector.push_back(10);
    myvector.push_back(20);
    myvector.push_back(30);
    
    cout << "myvector contains: ";
    for_each(myvector.begin(), myvector.end(), myfunction);  //函数名既是该函数的入口指针
    cout << endl;
    
    cout << "myvector contains: ";
    for_each(myvector.begin(), myvector.end(), myobject);
    cout << endl;
    return 0;
}
/*=======================================
 函数输出:myvector contains:  10 20 30
         myvector contains:  10 20 30
 =======================================*/

2.find:

[first,last)范围内比较元素值是否等于val并返回第一个等于 val元素的迭代器。如果找不到这样的元素,则该函数返回last。

template<class InputIterator, class T>
  InputIterator find (InputIterator first, InputIterator last, const T& val)
{
  while (first != last) {
    if (*first == val) return first;
    ++first;
  }
  return last;
}

函数用例

/*==================================================================
 函数操作:find()
 函数形参:将迭代器输入到序列中的初始位置和最终位置。使用的范围是[first,last).
         val-要在范围内搜索的值
 函数返回:比较等于 val 的范围中第一个元素的 iterator(指针类型/地址),如果没有元素匹配,则函数返回 last.
 注:1.返回查找元素对应角标方法:cout << p - myints.begin();
     因为find 返回值为指针类型,数组为连续存储,所以相减即可返回角标
     2.find 对象为 string 类型。则返回值为 vector<char>::iterator it;类型
        string str = "asfdasfs";     
        vector<char>::iterator it ;
        it = find(helper1.begin(), helper1.end(), str[i]);
        cout << helper2[it - helper1.begin()];
 =================================================================*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    //using find with array and pointer
    int myints[] = {10, 20, 30, 40};
    int *p;             //迭代器
    
    p = find(myints, myints + 4, 30);
    if(p != myints + 4)
        cout << "Element found in myints: " << *p << endl;
    else
        cout << "Element not found in myints" << endl;
    
    
    //using find eith vector and iterator
    vector<int> myvector(myints, myints + 4);
    vector<int>::iterator it;
    
    it = find(myvector.begin(), myvector.end(), 50);
    if(it != myvector.end())
        cout << "Element found in myints: " << *it << endl;
    else
        cout << "Element not found in myints" << endl;
    return 0;
}
/*=======================================
 函数输出:
  • 15
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值