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;
}
STL 统计vector容器中指定对象元素出现的次数:count()与count_if()算法的更多相关文章
- STL 查找vector容器中的指定对象:find()与find_if()算法
1 从vector容器中查找指定对象:find()算法 STL的通用算法find()和find_if()可以查找指定对象,参数1,即首iterator指着开始的位置,参数2,即次iterator指着停 ...
- 删除map容器中指定的元素
for (std::map<Int64,Int64>::iterator iter = ips_forbidden_.begin(); iter != ips_forbidden_.end ...
- 跟我一起学STL(2)——vector容器详解
一.引言 在上一个专题中,我们介绍了STL中的六大组件,其中容器组件是大多数人经常使用的,因为STL容器是把运用最广的数据结构实现出来,所以我们写应用程序时运用的比较多.然而容器又可以序列式容器和关联 ...
- vector容器中添加和删除元素
添加元素: 方法一: insert() 插入元素到Vector中 iterator insert( iterator loc, const TYPE &val ); //在指定位置loc前插入 ...
- 带你深入理解STL之Vector容器
C++内置了数组的类型,在使用数组的时候,必须指定数组的长度,一旦配置了就不能改变了,通常我们的做法是:尽量配置一个大的空间,以免不够用,这样做的缺点是比较浪费空间,预估空间不当会引起很多不便. ST ...
- 【C++】STL,vector容器操作
C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用需要的头 ...
- STL之Vector容器
1.Vector容器 1)vector是将元素置于一个动态数组中加以管理的容器. 2)vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲). 3)vecto ...
- 【Java面试题】54 去掉一个Vector集合中重复的元素
在Java中去掉一个 Vector 集合中重复的元素 1)通过Vector.contains()方法判断是否包含该元素,如果没有包含就添加到新的集合当中,适用于数据较小的情况下. import jav ...
- ca12a_c++顺序容器的操作5_访问容器中的数据元素
ca12a_c++顺序容器的操作5_访问容器中的数据元素访问元素:c.back()..显示最后一个数据c.front() ..显示第一个数据c[n],n就是下标,适合vector与dequec.at( ...
随机推荐
- gdal读写图像分块处理(精华版)
一.gdal进行数据操作在安装好gdal后,即可调用gdal库中的函数.(需要包含的头文件:gdal_priv.h)1.打开数据集使用gdal库进行数据(影像)操作的第一步就是打开一个数据集.对于“数 ...
- [置顶] Oracle GoldenGate 系列:使用 Oracle ASM API DBLOGREADER 时遇 ora-01031 错误
今天在自己新搭建的 Oracle ACFS 文件系统上测试 GoldenGate ,启动 extract 进程报如下错误: 2013-08-27 14:58:39 ERROR OGG-00446 ...
- MFC永久窗口对象与临时窗口对象
这篇讲得很清楚,就转过来了,原文如下: 因项目需要,最近在学习MFC,下午在一篇教程中提到了临时窗口.永久窗口,作者让读者自行查阅MSDN,了解临时窗口与永久窗口的概念,出于好奇,出于方便,直接百度一 ...
- Embedded software develop step
x86 –>embeded so you you must familiar with x86 first-
- INSERT INTO blog_appitem (user_id,appid,app_secret,is_valid) VALUES (1, 'wxf415741de036114c','48e1e345fd5f11c93af18ff1714c7f78',1)
微信公众平台 INSERT INTO blog_appitem (user_id,appid,app_secret,is_valid) VALUES (1, 'wxf415741de036114c', ...
- wireshark 过滤条件汇总
原文地址:http://blog.const.net.cn/a/9340.htm 一.针对wireshark最常用的自然是针对IP地址的过滤.其中有几种情况: (1)对源地址为192.168.0.1的 ...
- 区间dp-hdu-4745-Two Rabbits
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4745 题目意思: 给n个环状的数,A.B两人沿相反的方向走,每单位时间走一步,要求相同时间两人到达相 ...
- [转]Java汉字按照拼音排序
最近项目上使用到汉字排序的问题,网上搜索了一下后普遍使用下面的方法比较. @Test public void test_sort_pinyin() { Collator cmp = Collator. ...
- 网易云课堂_艾叔:零基础一站式C语言|C程序设计精讲_章节12:指针
课时63指针操作数组 二维数组 #include <stdio.h> #include <stdlib.h> int main() { int age[2][4] = { 1, ...
- 使用StoryBoard设置Scrollview的横向滚动不用一行代码
1).创建一个空工程Single类型的工程,然后打开故事版(StoryBoard)在ViewController上添加scrollview 2).然后对scrollview添加约束,上下左右全部都是0 ...