您的位置:首页 > 其它

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

2013-09-20 20:54 531 查看

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;
}

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐