STL之算法

本文详细介绍了C++标准模板库(STL)中的几种常用算法,包括sort(排序)、find(查找)、for_each(遍历操作)、max_element(查找最大元素)和min_element(查找最小元素),以及reverse(反转序列)。通过实例演示了这些算法的使用方法和应用场景。
摘要由CSDN通过智能技术生成

        C++标准模板库(STL)提供了丰富的算法,用于在容器上执行各种操作。下面是一些常用的STL算法:

一.使用前的准备:

#include <algorithm> //包含<algorithm>头文件

using namespace std;

二.常用算法举例:

1.sort(start,end):

1.1函数作用:

        默认对容器中的指定范围[start,end)(注意不包含end位置的元素!)内的元素进行升序排序。

1.2参数解释:

        start表示要排序的起始位置的迭代器,指向待排序范围的第一个元素。

        end表示要排序的结束位置的迭代器,指向待排序范围的最后一个元素的下一个位置。

        sort()函数将使用升序的方式对指定范围[start,end)内的元素进行排序,默认使用 < 运算符进行比较

1.3使用举例:

#include <algorithm>
#include <stdio.h>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec = {5, 9, 3, 5, 7, 1, 8, 6};

    auto start = vec.begin(); // 创建一个迭代器start并指向vector的开始
    auto end = vec.end(); // 创建一个指向vector的末尾的下一个位置的迭代器
    
    sort(start, end); // 使用std::sort函数对vector中的元素排序

    printf("排序后的vec为:\n");
    for (int i = 0; i < vec.size(); i++)
    {
        printf("%d ", *(it1 + i)); // 通过迭代器it1来访问并打印排序后的元素
    }
}


//输出:
排序后的vec为:
1 3 5 5 6 7 8 9

2.find(start,end,element):

2.1函数作用:

        在容器的指定范围[start,end)(注意不包含end位置的元素!)中查找特定值的第一个出现位置,返回指向该位置的一个迭代器。

2.2参数解释:

        start:指向容器中要搜索的起始位置的一个迭代器(包含在搜索范围内)。

        end:指向容器中要搜索的结束位置的一个迭代器,(不包含在搜索范围内)。

        element:要查找的特定值。

2.3补充一个辅助使用的函数distance(start,it):

        用于计算迭代器间距离的函数。它接受两个迭代器作为参数,并返回它们之间的距离,即两个迭代器之间的元素个数。由于find()函数返回的是指定元素的迭代器,不是该元素的位置下标,所以需要使用distance(start,it)函数计算出该元素到首元素的距离,即为该元素的位置下标。

2.4使用举例:

#include <algorithm>
#include <stdio.h>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec = {5, 9, 3, 5, 7, 1, 8, 6};
    
    // 创建一个名为vec的vector容器,并初始化一些整数
    
    auto end = vec.end();
    auto start = vec.begin();
    
    // 创建迭代器end,指向vec容器的末尾
    // 创建迭代器start,指向vec容器的开始
    
    auto it = find(start, end, 1);
    
    // 使用std::find函数在指定范围内查找值为1的元素
    // start是查找范围的起始位置的迭代器
    // end是查找范围的结束位置的迭代器
    // 1是要查找的元素的值
    
    int index = distance(start, it);
    
    // 使用std::distance函数计算start迭代器到it迭代器之间的距离
    // 即it迭代器所指向的元素在容器中的索引位置
    
    printf("元素1第一次出现的位置为:%d\n", index);
    
    // 打印找到的位置
    
    return 0;
}

//输出:
元素1第一次出现的位置为:5

3.for_each(start,end,func):

3.1函数作用:

        用于对容器中的每个元素执行指定的操作。它接受两个参数:一个表示容器的起始迭代器和一个表示容器的结束迭代器。然后,它将为容器中的每个元素调用传入的函数或函数对象,以执行指定的操作。

3.2参数解释:      

        start:指向容器中要搜索的起始位置的一个迭代器(包含在搜索范围内)。

        end:指向容器中要搜索的结束位置的一个迭代器,(不包含在搜索范围内)。

        func:要应用于每个元素的函数对象或函数指针。for_each()会遍历[start,end)范围内的每个元素,并对每个元素调用func函数。

3.3使用举例:

#include <stdio.h>
#include <vector>
using namespace std;

void print(int element)
{
    printf("%d ", element);
}

int main()
{
    vector<int> vec = {1, 2, 3, 4, 5};
    
    // 创建一个名为vec的vector容器,并初始化一些整数
    
    auto end = vec.end();
    auto start = vec.begin();
    
    // 创建迭代器end,指向vec容器的末尾
    // 创建迭代器start,指向vec容器的开始
    
    for_each(start, end, print);
    
    // 使用std::for_each函数遍历vec容器中的每个元素
    // 将每个元素作为参数传递给自定义的函数print
    // start是遍历的起始位置的迭代器
    // end是遍历的结束位置的迭代器
    
    return 0;
}

//输出:
1 2 3 4 5 

4.max_element(start,end):

4.1函数作用:

        用于在给定范围[start,end)内查找容器中的最大元素,并返回指向该最大元素的迭代器。

4.2参数解释:

        start:指向容器中要搜索的起始位置的一个迭代器(包含在搜索范围内)。

        end:指向容器中要搜索的结束位置的一个迭代器,(不包含在搜索范围内)。

4.3使用举例:

#include <algorithm>
#include <stdio.h>
#include <vector>
using namespace std;

int main()

{
    vector<int> vec = {1, 2, 3, 4, 5};
    auto end = vec.end();
    auto start = vec.begin();

    auto max = max_element(start, end);
    printf("最大元素为:%d\n", *max);
    return 0;
}

//输出:
最大元素为:5

        

5.min_element(start,end):

5.1函数作用:

        用于在给定范围[start,end)内查找容器中的最大元素,并返回指向该最大元素的迭代器。

5.2参数解释:

        start:指向容器中要搜索的起始位置的一个迭代器(包含在搜索范围内)。

        end:指向容器中要搜索的结束位置的一个迭代器,(不包含在搜索范围内)。

5.3使用举例:

#include <algorithm>
#include <stdio.h>
#include <vector>
using namespace std;


int main()

{
    vector<int> vec = {1, 2, 3, 4, 5};
    auto end = vec.end();
    auto start = vec.begin();

    auto min = min_element(start, end);
    printf("最小元素为:%d\n", *min);
    return 0;
}

//输出:
最小元素为:1

6.reverse(start,end):

6.1函数作用:

        用于反转容器中元素的顺序(后面的排到前面,前面的排到后面)。它接受两个迭代器参数,表示容器中要反转的范围[start,end)

6.2参数解释:

        start:指向容器中要搜索的起始位置的一个迭代器(包含在搜索范围内)。

        end:指向容器中要搜索的结束位置的一个迭代器,(不包含在搜索范围内)。

6.3使用举例:

#include <algorithm> // 包含算法头文件
#include <stdio.h>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec = {1, 2, 3, 4, 5}; // 创建一个名为vec的vector容器,并初始化一些整数

    auto end = vec.end(); // 创建迭代器end,指向vec容器的末尾
    auto start = vec.begin(); // 创建迭代器start,指向vec容器的开始

    reverse(start, end); // 使用std::reverse反转vec容器中元素的顺序
    printf("反转容器元素顺序后:\n");
    for (int i = 0; i < vec.size(); i++) // 通过循环打印反转后的容器元素的值
    {
        printf("%d ", *(start + i)); // *(start + i)用于访问第i个元素的值
    }

    return 0;
}

//输出:
反转容器元素顺序后:
5 4 3 2 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yuga...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值