• STL 统计vector容器中指定对象元素出现的次数:count()与count_if()算法


    1 统计vector向量中指定元素出现的次数:count()算法

       利用STL通用算法统计vector向量中某个元素出现的次数:count()算法统计等于某个值的对象的个数

    #include "stdafx.h"

    #include <iostream>

    #include <vector>

    #include <algorithm> //包含通用算法

    using namespace std;

    int_tmain(int argc, _TCHAR* argv[])

    {

        vector<int> scores;

        scores.push_back(100);

        scores.push_back(80);

        scores.push_back(45);

        scores.push_back(75);

        scores.push_back(99);

        scores.push_back(100);

        int num = 0;

        num= count(scores.begin(),scores.end(),100);//统计100出现的次数

        cout<<"times: "<<num<<endl;

        return 0;

    }

    2 count_if():利用函数对象统计满足条件对象的个数

    函数对象是一个至少带有一个operator()方法的类。

    函数对象被约定为STL算法调用operator时返回true或false,它们根据这个来判定这个函数。

    count_if()函数通过传递一个函数对象来做出比count()统计函数更加复杂的评估以确定一个对象是否应该被计数,即count_if()函数的功能等同于count()函数和一些条件语句。

    例子:1

    #include "stdafx.h"

    #include <iostream>

    #include <vector>

    #include <algorithm>

    #include <string>

    using namespace std;

    conststring TC("0003");

    classIsTB

    {

    public:

        IsTB(){cout<<"执行默认构造函数"<<endl;}

        bool operator()(string& saleRecord)

        {

           return (saleRecord.substr(0,4) == TC);

        }

    };

    int_tmain(int argc, _TCHAR* argv[])

    {

        vector<string>saleRecordVec;

        saleRecordVec.push_back("0001 Soap");

        saleRecordVec.push_back("0002 Shampoo");

        saleRecordVec.push_back("0003 ToothBrush");

        saleRecordVec.push_back("0004 Toothpaste");

        saleRecordVec.push_back("0003 ToothBrush");

        int num = 0;

        num= count_if(saleRecordVec.begin(),saleRecordVec.end(),IsTB());

        cout<<"Times: "<<num<<endl;

        IsTBobjIsTB;

        //利用已有的对象

        num= count_if(saleRecordVec.begin(),saleRecordVec.end(),objIsTB);

        cout<<"Times: "<<num<<endl;

     

        return 0;

    }

    count_if()函数的第三个参数是类对象。

    执行结果:

    如果需要给函数对象传递更多的信息,那么可以通过定义一个非缺省的构造函数来初始化所需要的信息。

    例子:2

    #include "stdafx.h"

    #include <iostream>

    #include <vector>

    #include <algorithm>

    #include <string>

    using namespace std;

    classIsTB

    {

    public:

        IsTB(string& str){ m_str =str;} //通过构造函数传递信息

        bool operator()(string&saleRecord)

        {

           return (saleRecord.substr(0,4) == m_str);

        }

    private:

        stringm_str;

    };

     

    int_tmain(int argc, _TCHAR* argv[])

    {

        vector<string>saleRecordVec;

        saleRecordVec.push_back("0001 Soap");

        saleRecordVec.push_back("0002 Shampoo");

        saleRecordVec.push_back("0003 ToothBrush");

        saleRecordVec.push_back("0004 Toothpaste");

        saleRecordVec.push_back("0003 ToothBrush");

        int num = 0;

        stringstr("0003");

        num= count_if(saleRecordVec.begin(),saleRecordVec.end(),IsTB(str));

        cout<<"Times: "<<num<<endl;

        IsTBobjIsTB(str);

        //利用已有的对象

        num= count_if(saleRecordVec.begin(),saleRecordVec.end(),objIsTB);

        cout<<"Times: "<<num<<endl;

     

        return 0;

    }

  • 相关阅读:
    创建react项目
    解决移动端弹窗下页面滚动问题
    前端常用的几种加密方式
    http请求状态码
    vue代理配置
    自动化测试实操案例详解 | Windows应用篇
    Google 再见 Java
    一次诡异的 SQL 数量统计查询不准的问题
    Maven
    淘宝技术分享:手淘亿级移动端接入层网关的技术演进之路
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3331161.html
Copyright © 2020-2023  润新知