zoukankan      html  css  js  c++  java
  • C++11标准中常用到的各种算法汇总.

    在C++11标准中定义了很多算法,这些算法可以让我们很方便的操作各种容器和数组,这里要注意一下,这些算法操作的并非容器,而是迭代器,然后通过迭代器来操作容器中的数据,算法本身并不会关注容器中保存的数据的类型。

    以下是我对常识的算法的总结,这些算法大部分都在algorithm.h中,还有一些在numeric.h中。

    这里我们的容器都用这几个:

    vector<string> vec;

    vector<int> vec1;

    vec<string> vec2;

    1.find();

       find()算法的作用是在指定的一段序列中查找某个数,包含三个参数,前两个参数是表示元素范围的迭代器,第三个参数是要查找的值。

       例:fing(vec.begin(), vec.end(), val); //在vec中查找值val,该val可以是数字、字符串。

    2.count();

       count()算法的作用是查看给定序列中给定值出现的次数,同样包含三个参数,前两个参数是表示元素范围的迭代器,第三个参数是要查找的值。

       例:count(vec1.begin(), vec1.end(), 2);//在vec1中查看2出现的次数。

    3.accumulate();//该函数在numeric.h文件中

       accumulate()函数的作用是计算指定范围中各个数相加的和。包含三个参数,前两个参数是求和的序列范围,第三个参数是和的初始值。

       例:accumulate(vec1.begin(), vec1.end(), 0);//计算vec1中各个数相加的总和,和的初始值为0;

    4.equal();

       equal()算法的作用是确定两个序列是否保存相同的值,此算法接受三个迭代器,前两个迭代器表示第一个序列中元素的范围,第三个迭代器表示第二个序列的手元素。如果相等,则返回true, 否则返回false;

       equal(vec.begin(), vec.end(), vec2.begin());//比较vec和vec2中的元素是否相同。

    5.fill();

       fill()算法的作用是对一个范围内的所有元素赋值,包含三个参数,前两个参数接受一对迭代器表示一个范围,第三个迭代器接受一个值。

       例:fill(vec.begin(), vec.end(), "");//将vec中的所有元素都置为空。

    6.fill_n();

       fill_n算法的作用是将给定值赋给迭代器指向的元素开始的指定个元素。第一个参数接受一个迭代器,第二个元素接受一个计数值,第三个迭代器接受一个值。

       例:fill_n(vec.begin(), vec.size(), "");//将vec中的所有元素置为空。

       :这里介绍一下back_inserter,它是一种插入迭代器,是一种向容器中添加元素的迭代器,它定义在iterator.h中,每调用一次back_inserter,函数则会调用一    次push_back。

       例:auto i = back_inseter(vec1);//通过它赋值会将元素添加到vec中

            *i = 42;//vec1中现有有一个元素,值为42

       这里back_inserter常用来创建一个迭代器作为算法的目的位置来使用。

       例:fill_n(back_inserter(vec1), 10, 0);//向vec1的末尾添加10个元素,元素值为0;

    7.copy();

       copy()算法将输入范围中的元素拷贝到目的序列中。包括三个参数,前两个表示一个输入范围,第三个表示序列的起始位置。

       例:int a1[] = {0,1,2,3,4,5,6,7,8,9};

            int a2[sizeof(a1)/sizeof(*a1)];

            //ret指向拷贝到a2的为元素之后的位置

            auto ret = copy(begin(a1), end(a1), a2);//把a1的内容拷贝到a2.

    8.replace();

       replace()算法的作用是将给定序列中所有等会给定值的元素都改为另一个值,此算法接收四个参数,前两个是迭代器,表示输入序列范围,第三个是表示要搜索的      值,第四个是要换的新值。

       例:replace(vec.begin(), vec.end(), "", "test");//将vec中的空字符串改为test。

       如果我们需要保证原序列的值不变,则可以使用replace_copy()算法,使原序列不变,将改变后的序列值拷贝给新容器。

       例:replace_copy(vec.begin(), vec.end(),back_inserter(vec2), "", "test");//将修改后的新序列保存到vec2中,原序列值不变。  

    9.sort();

       sort()算法的作用是重新排列输入的序列中的元素,它是按照字典序列来重新排布序列。

       例:vector<string> vec = {"the", "quick", "red", "for", "jump","over", "the", "slow", "red", "turtle"};

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

            执行完后的结果:for jump over quick red slow the the turtle

    10.unique();

        unique()算法的作用是重新排列输入的序列号,并使前面的每个单词都只出现一次,返回指向不重复区域之后一个位置的迭代器。

        如9的vec,auto end_unique = unique(vec.begin(), vec.end());

         执行完后的结果:for jump over quick red slow the  turtle the

         这是如果我们需要得到一个不重复的序列,则只需要使用erase()即可,即

         vec.erase(end_unique, vec.end());

          执行完后的结果:for jump over quick red slow the  turtle 

    :为了讲后面的算法,这里先普及一下谓词,这里所谓的谓词并不是语言语法上的谓词,而是向算法传递的函数名。

        例:bool isShort(const string &s1, const string &s2)

          { return s1.size() < s2.size(); }

         前面的sort()算法也是可以接收谓词的,如sort(vec.begin(), vec.end(), isShort);

         该语句的意思是重新排列序列,但是是按照字符串的长度从小到大的顺序排列。

    11.partiton();

        partition()算法的作用是对输入的容器的内容进行划分,该算法返回一个迭代器,返回指向最后一个是谓词为true的元素之后的位置。接受三个

        参数,前两个是元素的范围迭代器,后一个是划分标准。

        例:bool bigger(const string &a)

            { return a.size() > 5; }

            partition(vec.begin(), vec.end(), bigger);//将vec划分开,前部分是长度大于5的字符串,后部分是长度小于等于5的字符串。

    :这样再讲一下可调用对象lambda,格式[capture list](parameter list)->reture type{function boby}

         其中capture list(捕获列表)是一个lambda所在函数中定义的局部变量的列表(通常为空),reture type、parameter list、function boby和其他的函数一      样,分别表示返回类型、参数列表、函数体。像11中的例子可以写成:

         partition(vec.begin(), vec.end(), [](const string &a) {return a.size()>5;});//可以和上面达到一样的效果

    12.find_if();

        find_if()算法的作用是在输入序列中查找第一个满足条件的元素,返回第一个指向满足条件的元素的迭代器。

        例:auto wc = find_if(vec.begin(), vec.end(), [sz](const string &a){return a.size>=sz;});//其中sz为在使用find_if的函数内部定义的局部变量。

        上诉算法得到的是第一个指向长度不小于sz的元素的迭代器,如果没有则返回vec.end();

    13.for_each();

        for_each()算法的主要作用是打印输出序列。接收三个参数,前两个为打印元素的范围,后一个为一个可调用对象。

        例:for_each(wc, vec.end(), [](const string &s){cout << s << " ";});

             cout << endl;

        上述程序的作用就是打印输出序列中从wc到vec.end()中的元素。

  • 相关阅读:
    SpringMVC中静态获取request对象 Spring中获取 HttpServletRequest对象【转载】
    springcloud 的loadbalancer 轮询算法切换方法 2021.4.3
    springboot项目启动增加图标
    rabbitmq 端口作用以及修改方法
    centos8 安装rabbitmq
    springcloud config client Value获取不到信息的问题的处理方法
    springcloud config配置git作为数据源然后启动报错 If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
    Sublime Text的列模式如何操作
    centos8 安装redis
    jQuery简单的Ajax调用
  • 原文地址:https://www.cnblogs.com/pengjun-shanghai/p/4844185.html
Copyright © 2011-2022 走看看