天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 3|回复: 0

C++11标准中常用到的各种算法汇总.

[复制链接]
  • TA的每日心情
    开心
    昨天 15:23
  • 签到天数: 69 天

    [LV.6]常住居民II

    410

    主题

    167

    回帖

    2704

    积分

    管理员

    积分
    2704
    发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
    在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()中的元素。

     

     

     

     

    C++11标准中常用到的各种算法汇总.
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|

    GMT+8, 2024-7-1 05:15 , Processed in 0.062862 second(s), 23 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表