C++基础教程面向对象(学习笔记(93))

STL算法概述

除了容器类和迭代器之外,STL还提供了许多用于处理容器类元素的通用算法。这些允许您执行诸如搜索,排序,插入,重新排序,删除和复制容器类的元素之类的操作。

请注意,算法是作为使用迭代器操作的全局函数实现的。这意味着每个算法只需要实现一次,它通常会自动适用于提供一组迭代器(包括自定义容器类)的所有容器。虽然这非常强大并且能够快速编写复杂代码,但它也有一个糟糕的一面:算法和容器类型的某些组合可能不起作用,可能导致无限循环,或者可能工作,但性能极差。因此,冒风险使用这些。

STL提供了相当多的算法,我们只会在这里触及一些更常见且易于使用的算法。其余的(以及完整的细节)将保存为STL算法的章节。

要使用任何STL算法,只需包含算法头文件。

min_element和max_element

min_element和max_element算法在容器类中查找min和max元素:

#include <iostream>
#include <list>
#include <algorithm>
int main()
{
    using namespace std;
 
    list<int> li;
    for (int nCount=0; nCount < 6; nCount++)
        li.push_back(nCount);
 
    list<int>::const_iterator it; // 声明一个迭代器
    it = min_element(li.begin(), li.end());
        cout << *it << " ";
    it = max_element(li.begin(), li.end());
        cout << *it << " ";
	
    cout << endl;
}

打印:

0 5

find(和list :: insert)

在这个例子中,我们将使用find()算法在列表类中查找一个值,然后使用list :: insert()函数在该点向列表中添加一个新值。

#include <iostream>
#include <list>
#include <algorithm>
int main()
{
    using namespace std;
 
    list<int> li;
    for (int nCount=0; nCount < 6; nCount++)
        li.push_back(nCount);
 
    list<int>::iterator it; // 声明一个迭代器
    it = find(li.begin(), li.end(), 3); //在列表中找到值3
    li.insert(it, 8); //使用list :: insert在它之前插入值8
 
    for (it = li.begin(); it != li.end(); it++) //for循环与迭代器
        cout << *it << " ";
    	
    cout << endl;
}

这将打印该值

0 1 2 8 3 4 5

排序和反转

在这个例子中,我们将对矢量进行排序,然后将其反转。

#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
    using namespace std;
 
    vector<int> vect;
    vect.push_back(7);
    vect.push_back(-3);
    vect.push_back(6);
    vect.push_back(2);
    vect.push_back(-5);
    vect.push_back(0);
    vect.push_back(4);
 
    sort(vect.begin(), vect.end()); // 排序列表
 
    vector<int>::const_iterator it; // 声明一个迭代器
    for (it = vect.begin(); it != vect.end(); it++) //for循环与迭代器
        cout << *it << " ";
 
    cout << endl;
 
    reverse(vect.begin(), vect.end()); // 反转清单
 
    for (it = vect.begin(); it != vect.end(); it++) // for循环与迭代器
        cout << *it << " ";
 	
    cout << endl;
}

这会产生结果:

-5 -3 0 2 4 6 7
7 6 4 2 0 -3 -5

请注意,sort()不适用于列表容器类 ,列表类提供了自己的sort()成员函数,这比泛型版本更有效。

Conclusion:

虽然这只是STL提供的算法的一种尝试,但它应该足以说明它们与迭代器和基本容器类一起使用是多么容易。还有足够的其他算法来填满整章!

猜你喜欢

转载自blog.csdn.net/qq_41879485/article/details/84858790
今日推荐