【STL】算法使用篇

一、概述

这里写图片描述

  • STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。这样一来,只要我们熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能并大大地提升效率。

  • “algorithm” 是所有STL头文件中最大的一个(尽管它很好理解),使用STL算法必须包含该头文件,它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。

  • “numeric” 体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。

  • “functional” 中则定义了一些模板类,用以声明函数对象。


二、函数功能认识

1、查找 find
#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>

using namespace std;

int main()
{
    int num = 12;
    vector<int> v;

    for (int i = 0; i < 10; i++)
        v.push_back(3 * i);

    cout << "Vector<int> v : ";
    for (vector<int>::size_type index = 0; index != v.size(); ++index)
        cout << v[index] << "  ";
    cout << endl;

    vector<int>::iterator result;
    result = find(v.begin(), v.end(), num);
    if (result != v.end())
        cout << "匹配元素的索引:" << result - v.begin() << endl;
    else
        cout << "没有匹配元素的索引:" << endl;
    return 0;
}
  • 输出:

Vector v : 0 3 6 9 12 15 18 21 24 27
匹配元素的索引:4
请按任意键继续…

2、条件查找 find_if
  • 利用返回布尔值的谓词判断pred,检查迭代器区间 [first,last) 上的每一个元素,如果迭代器i满足pred(*i)=true,表示找到元素并返回迭代值i(找到的第一个符合条件的元素),未找到元素,返回末位置last。

  • 函数原型:find_if(v.begin(), v.end(), finda)。

bool finda(int x)
{
    return (x) % 10 ? 0 : 1;
}

int main()
{
    vector<int> V;

    for (int i = 0; i < 15; ++i)
        V.push_back((i + 1)*(i + 2));

    cout << "vector<int> v is: ";
    for (vector<int>::size_type index = 0; index != V.size(); ++index)
        cout << V[index] << "  ";
    cout << endl;

    vector < int >::iterator result;
    result = find_if(V.begin(), V.end(), finda);
    if (result != V.end())
        cout << "第一个能整除10的元素" << *result << endl;
        cout<< "索引" << result - V.begin() << endl;


    return 0;
}
  • 输出

vector v is: 2 6 12 20 30 42 56 72 90 110 132 156 182 210 240
第一个能整除10的元素20
索引3
请按任意键继续…

3、最后一个子序列查询 find_end
  • 查找子序列v2在v1中最后出现的位置。

  • 函数原型:find_end(v1.begin(), v1.end(), v2.begin(), v2.end())

int main(void)
{
    vector<int> v1;
    vector<int> v2;

    for (int i = 0; i<10; ++i)
        v1.push_back(i);

    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);
    v1.push_back(2);
    v1.push_back(3);
    v1.push_back(4);


    for (int i = 1; i<4; ++i)
        v2.push_back(i);

    cout << "vector<int> v1: ";
    for (vector<int>::size_type index = 0; index != v1.size(); ++index)
        cout << v1[index] << " ";

    cout << endl;

    cout << "vector<int> v2: ";
    for (vector<int>::size_type index = 0; index != v2.size(); ++index)
        cout << v2[index] << " ";

    cout << endl;

    vector<int>::iterator result = find_end(v1.begin(), v1.end(), v2.begin(), v2.end());

    if (result != v1.end())
        cout << "v2在v1的最后位置:v[" << result - v1.begin() << "]" << endl;
    else
        cout << "v2不在v1中" << endl;

    return 0;
}
  • 输出:

vector v1: 0 1 2 3 4 5 6 7 8 9 1 2 3 2 3 4
vector v2: 1 2 3
v2在v1的最后位置:v[10]
请按任意键继续…

4、统计 count
  • 元素统计count:统计某个指定的值出现了多少次。

  • 函数原型:count(v.begin(), v.end(), value)

int main()
{
    vector<int> v;
    for (int i = 0; i < 10; i++)
        v.push_back(i);
    v.push_back(5);

    cout << "vector<int> v is:";
    for (vector<int>::size_type index = 0; index != v.size(); ++index)
        cout << v[index] << "  ";
    cout << endl;


    int Count = count(v.begin(), v.end(), 5); //统计5出现的次数
    cout << "次数:" << Count << endl;
    return 0;
}
  • 输出:

vector v is:0 1 2 3 4 5 6 7 8 9 5
次数:2
请按任意键继续…

5、条件统计 count_if
  • 条件统计count_if:统计符合某个指定条件的值出现了多少次。

  • 函数原型:count_if(v.begin(), v.end(), greater6)

bool greater6(int x)
{
    return x % 3  == 0;
}

int main()
{
    vector<int> v;
    for (int i = 0; i < 10; i++)
        v.push_back(i);

    cout << "vector<int> v is : ";
    for (vector<int>::size_type index = 0; index != v.size(); ++index)
        cout << v[index] << "  ";
    cout << endl;

    int Ret = count_if(v.begin(), v.end(), greater6);

    cout << Ret << endl;

}
  • 输出:

vector v is : 0 1 2 3 4 5 6 7 8 9
4
请按任意键继续…

6、子序列搜索search
  • 在一个序列中搜索与另一序列匹配的子序列。参数分别为一个序列的开始位置,结束位置和另一个序列的开始,结束位置。

  • 函数原型:search(v1.begin(), v1.end(), v2.begin(), v2.end())

int test()
{
    vector<int> v1;
    vector<int> v2;

    for (int i = 0; i < 10; i++)
        v1.push_back(i);

    for (int i = 4; i < 6; i++)
        v2.push_back(i);

    cout << "vector<int> v1 :";
    for (vector<int>::size_type index = 0; index < v1.size(); index++)
        cout << v1[index] << "  ";
    cout << endl;

    cout << "vector<int> v2 :";
    for (vector<int>::size_type index = 0; index < v2.size(); index++)
        cout << v2[index] << "  ";
    cout << endl;

    vector<int>::iterator result = search(v1.begin(), v1.end(), v2.begin(), v2.end());

    if (result != v1.end())
        cout << "V2的元素包含在v1中,范围:v1[" << result - v1.begin() << "]~v1[" << result + v2.size() - v1.begin() - 1 << "]" << endl;
    else
        cout << "v2的元素不包含在v1中" << endl;

    return 0;
}



int main()
{
    test();
    return 0;
}
  • 输出:

vector v1 :0 1 2 3 4 5 6 7 8 9
vector v2 :4 5
V2的元素包含在v1中,范围:v1[4]~v1[5]
请按任意键继续…

7、复制copy
  • 将一个容器的元素复制到另一个元素中。

  • 函数原型:copy(v1.begin(), v1.end(), v2.begin())

void test()
{
    vector<int> v1;
    vector<int> v2;

    for (int i = 11; i<15; ++i)
        v1.push_back(i);

    for (int i = 0; i<10; ++i)
        v2.push_back(i);

    cout << "vector<int> v1: ";
    for (vector<int>::size_type index = 0; index != v1.size(); ++index)
        cout << v1[index] << " ";

    cout << endl;

    cout << "vector<int> v2: ";
    for (vector<int>::size_type index = 0; index != v2.size(); ++index)
        cout << v2[index] << " ";

    cout << endl<<endl;


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

    cout << "vector<int> v2: ";
    for (vector<int>::size_type index = 0; index != v2.size(); ++index)
        cout << v2[index] << " ";

    cout << endl;



    cout << "vector<int> v1: ";
    for (vector<int>::size_type index = 0; index != v1.size(); ++index)
        cout << v1[index] << " ";

    cout << endl;
}
  • 输出:

vector v1: 11 12 13 14
vector v2: 0 1 2 3 4 5 6 7 8 9

vector v2: 11 12 13 14 4 5 6 7 8 9
vector v1: 11 12 13 14
请按任意键继续…

8、元素改变transform
  • 将一个容器的元素改变之后放到另一个容器中。

  • 函数原型:transform(v1.begin(), v1.end(), v2.begin(), op_increase)

int op_increase(int x)
{
    return x*x;
}

void test()
{
    vector<int> v1;
    vector<int> v2;

    for (int i = 11; i<15; ++i)
        v1.push_back(i);

    for (int i = 0; i<10; ++i)
        v2.push_back(i);

    cout << "vector<int> v1: ";
    for (vector<int>::size_type index = 0; index != v1.size(); ++index)
        cout << v1[index] << " ";

    cout << endl;

    cout << "vector<int> v2: ";
    for (vector<int>::size_type index = 0; index != v2.size(); ++index)
        cout << v2[index] << " ";

    cout << endl<<endl;


    transform(v1.begin(), v1.end(), v2.begin(), op_increase);

    cout << "vector<int> v2: ";
    for (vector<int>::size_type index = 0; index != v2.size(); ++index)
        cout << v2[index] << " ";

    cout << endl;



    cout << "vector<int> v1: ";
    for (vector<int>::size_type index = 0; index != v1.size(); ++index)
        cout << v1[index] << " ";

    cout << endl;
}
  • 输出:

vector v1: 11 12 13 14
vector v2: 0 1 2 3 4 5 6 7 8 9
vector v2: 121 144 169 196 4 5 6 7 8 9
vector v1: 11 12 13 14
请按任意键继续…

9、替换replace
  • 将指定元素值替换为新值。

  • 函数原型:replace(v.begin(), v.end(), n, m)

int main()
{
    vector<int> v;
    for (int i = 0; i < 10; i++)
        v.push_back(i);
    v.push_back(5);

    cout << "vector<int> v is:";
    for (vector<int>::size_type index = 0; index != v.size(); ++index)
        cout << v[index] << "  ";
    cout << endl<<endl;


    replace(v.begin(), v.end(), 5, 100);    //将5替换成100
    cout << "vector<int> v is:";
    for (vector<int>::size_type index = 0; index != v.size(); ++index)
        cout << v[index] << "  ";
    cout << endl;
    return 0;
}
  • 输出:

vector v is:0 1 2 3 4 5 6 7 8 9 5
vector v is:0 1 2 3 4 100 6 7 8 9 100
请按任意键继续…

10、fill_n(b,n,v)
  • 填充[b, b+n)范围。

  • 函数原型:fill(b, n, m)

int main()
{
    vector<int> v;
    for (int i = 0; i < 10; i++)
        v.push_back(i);
    v.push_back(5);

    cout << "vector<int> v is:";
    for (vector<int>::size_type index = 0; index != v.size(); ++index)
        cout << v[index] << "  ";
    cout << endl<<endl;


    fill_n(v.begin(), 3, 100);    //
    cout << "vector<int> v is:";
    for (vector<int>::size_type index = 0; index != v.size(); ++index)
        cout << v[index] << "  ";
    cout << endl;
    return 0;
}

  • 输出:

vector v is:0 1 2 3 4 5 6 7 8 9 5
vector v is:100 100 100 3 4 5 6 7 8 9 5
请按任意键继续…

11、容器填充 generate
  • 按一定方法填充容器。

  • 函数原型:generate(v.begin(), v.end(), increase)

int increase(void)
{
    static int x = 1;

    return (x++) + (x+2);
}

int main(void)
{
    vector<int> v(10);

    generate(v.begin(), v.end(), increase);

    cout << "vector<int> v: ";
    for (vector<int>::size_type i = 0; i<v.size(); ++i)
        cout << v[i] << " ";

    cout << endl;

    return 0;
}
  • 输出:

vector v: 4 6 8 10 12 14 16 18 20 22
请按任意键继续…

12、移除 remove
  • remove并不会真正删除容器中的元素。是把区间内的元素值为指定值的元素的位置腾出,然后后面的元素就会往前移动,但是原来容器的end()并不会改变。

  • 函数原型:remove(v.begin(), v.end(), n)

int main()
{
    vector<int> v;

    for (int i = 1; i<=10; i++)
        v.push_back(i);

    cout << "vector<int> v: ";
    for (vector<int>::size_type i = 0; i<v.size(); ++i)
        cout << v[i] << " ";

    cout << endl;

    remove(v.begin(), v.end(), 5);     //

    cout << "Remove vector<int> v: ";
    for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)   
        cout << *it << " ";

    cout << endl;

    return 0;
}


  • 输出:

vector v: 1 2 3 4 5 6 7 8 9 10
Remove vector v: 1 2 3 4 6 7 8 9 10 10
请按任意键继续…

13、unique
  • 删除相邻的重复元素,然后重新排列输入范围内的元素。

  • 函数原型:unique(v.begin(), v.end())

int main(void)
{
    vector<int> v;

    v.push_back(1);
    v.push_back(1);
    v.push_back(2);
    v.push_back(2);
    v.push_back(3);
    v.push_back(3);
    v.push_back(4);
    v.push_back(4);

    cout << "vector<int> v: ";
    for(vector<int>::size_type i=0; i<v.size(); ++i)
        cout << v[i] << " ";

    cout << endl;

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

    cout << "Unique vector<int> v: ";
    for(vector<int>::iterator it=v.begin(); it!=v.end(); ++it)
        cout << *it << " ";

    cout << endl;

    return 0;
}
  • 输出:

vector v: 1 1 2 2 3 3 4 4
Unique vector v: 1 2 3 4 3 3 4 4
请按任意键继续…

14、排序 Sort
  • 函数原型:sort (v.begin(), v.end())
int main(void)
{
    vector<int> v;

    v.push_back(1);
    v.push_back(7);
    v.push_back(8);
    v.push_back(4);
    v.push_back(9);
    v.push_back(3);
    v.push_back(10);
    v.push_back(15);

    cout << "vector<int> v: ";
    for(vector<int>::size_type i=0; i<v.size(); ++i)
        cout << v[i] << " ";

    cout << endl;

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

    cout << "Sort vector<int> v: ";
    for(vector<int>::iterator it=v.begin(); it!=v.end(); ++it)
        cout << *it << " ";

    cout << endl;

    return 0;
}
  • 输出:

vector v: 1 1 2 2 3 3 4 4
Unique vector v: 1 2 3 4 3 3 4 4
请按任意键继续…

也可以自己编写排序函数:

bool function(int x, int y)
{
    return (x > y);
}

int main(void)
{
    vector<int> v;

    v.push_back(1);
    v.push_back(7);
    v.push_back(8);
    v.push_back(4);
    v.push_back(9);
    v.push_back(3);
    v.push_back(10);
    v.push_back(15);

    cout << "vector<int> v: ";
    for (vector<int>::size_type i = 0; i<v.size(); ++i)
        cout << v[i] << " ";

    cout << endl;

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

    cout << "Sort vector<int> v: ";
    for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
        cout << *it << " ";

    cout << endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37925202/article/details/81224368