C++中泛型算法

前面几篇博客简单的介绍了几种标准库容器,想必大家一定会感觉标准库中的各个容器的操作函数特别的少。的却标准库并没有给每一个容器单独定义很多操作函数,而是提供了一堆通用的函数来供其一起使用。

1.泛型算法的概述

C++中大多数算法都定义在头文件algorithm中,当然头文件numeric中定义了一组数值泛型算法
通常情况下,这些算法不会直接操作容器,只是遍历由俩个迭代器指定的元素范围来进行操作(所以这些算法一般不会改变容器的大小)

2.只读算法

此类算法只读取迭代器范围的俄元素,而不会改变元素
(1)find函数
此函数的功能为查找指定元素
find函数的前来个参数为迭代器范围,第三个参数为要查找的值,返回值为该元素的迭代器,若返回失败则返回尾部迭代器
具体实例如下

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
int main(void)
{
    vector<int> v = {
        1,2,3,4,5
    };

    auto it = find(v.begin(),v.end(),3);

    if(it == v.end())
    {
        cout<<"没找到此元素"<<endl;
    }
    else
    {
        cout<<"找到该元素"<<endl;
    }


    return 0;
}

(2)count函数
此函数的功能为找到指定范围内相等的元素的个数
它的前来个参数为一对迭代器范围,第三个元素为判断相等的元素
具体实例如下

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
int main(void)
{
    vector<int> v = {
        1,2,3,3,3,4,5,6
    };

    int n = count(v.begin(),v.end(),3);

    cout<<"n = "<<n<<endl;
    return 0;

}

(3)accumulate函数
此函数为得出,给定范围所有元素的总和
前俩个参数为一对迭代器范围,第三个参数为和的初始值
具体实例如下

#include<iostream>
#include<vector>
#include<numeric>

using namespace std;
int main(void)
{
    vector<int> v = {
        1,2,3,4,5
    };

    int sum = accumulate(v.begin(),v.end(),0);

    cout<<"sum" <<sum<<endl;
    return 0;

}

3.写容器元素的算法

(1)fill函数
此函数的功能为将给定范围内的元素值换为另一个值
前俩个参数为一对迭代器,第三个参数为替换后的值
具体实例如下

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
int main(void)
{
    vector<int> v = {
        1,2,3,4,5
    };

    fill(v.begin(),v.end(),9);

    for(auto x:v)
    {
        cout<<x<<" ";

    }
    cout<<endl;

    return 0;
}

(2)back_inserter
此函数功能为返回一个插入迭代器,供我们向容器内插入数据
其参数为一个迭代器的引用
具体实例如下

#include<iostream>
#include<vector>
#include<iterator>

using namespace std;
int main(void)
{
    vector<int> v;

    //该函数参数类型为引用
    auto it = back_inserter(v);
    *it = 5;
    *it = 7;

    for(auto x:v)
    {
        cout<<x<<" ";
    }
    cout<<endl;

    return 0;
}

(3)copy函数
该函数的功能为向另一个目的位置迭代器写入写入一段源迭代器内容
前俩个参数为迭代器范围,第三个参数为目的迭代器
具体实例如下

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
int main(void)
{
    vector<int> v(5,10);

    vector<int> v1(5);

    copy(v.begin(),v.end(),v1.begin());

    for(auto x:v1)
    {
        cout<<x<<" ";
    }

    cout<<endl;

    return 0;
}

(4)replace函数
该函数的功能为将一段迭代器范围内的元素中等于某个值的元素替换为另一个值
前俩个参数为一对迭代器,第三个参数为要找的元素的值,第四个参数为被替换后的值
具体实例如下

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
int main(void)
{
    vector<int> v = {
        1,2,3,3,3,3,4
    };

    replace(v.begin(),v.end(),3,8);

    for(auto x:v)
    {
        cout<<x<<" ";
    }

    cout<<endl;

    return 0;
}

(5)sort和unique函数
sort函数的功能为给指定范围内的元素排序(默认升序),unique函数的功能为将排好序范围内的元素中重复的元素放到不重复元素之后
此俩个函数的参数都为一对迭代器
具体实例如下

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
int main(void)
{
    vector<int> v = {
        3,1,5,7,6,3,3,3
    };

    sort(v.begin(),v.end());

    //输出排序后结果
    cout<<"排序之后的结果:";
    for(auto x:v)
    {
        cout<<x<<" ";
    }
    cout<<endl;

    //使用unique去重
    auto end_it = unique(v.begin(),v.end());
    cout<<"使用unique之后的结果:";
    for(auto x:v)
    {
        cout<<x<<" ";
    }
    cout<<endl;

    //将迭代器end_it之后的重复数字删除之
    v.erase(end_it,v.end());

    cout<<"去重之后的结果";
    for(auto x:v)
    {
        cout<<x<<" ";
    }
    cout<<endl;

    return 0;
}

你可能感兴趣的:(C++,算法,泛型)