C++系列-STL容器中统计算法count, count_if

STL容器中统计算法count, count_if

💢功能

  • 🥝count用于统计容器中某个特定元素的个数,使用的是==运算符。
  • 🥝count_if根据指定的条件统计满足条件的元素的个数。
  • 🥝如果统计自定义类型,需要重载==运算符或者自定义pred。

💢非自定义类型举例

👉 👉 👉

count(vec1.begin(), vec1.end(), 5),统计vec1中5的数量。

count_if(vec1.begin(), vec1.end(), \[\](int val) -> bool {return val > 3;}),统计vec1中满足大于3的元素的数量。

cpp 复制代码
code:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

template<typename T>
void print_vector(const vector<T>& vec)
{
	for (auto i_vec : vec)
	{
		cout << i_vec << " ";
	}
	cout << endl;
}

void test01()
{
	vector<int> vec1 {1, 2, 5, 7, 25, 5, 5, 7, 33, 44};
	print_vector(vec1);

	int cnt = count(vec1.begin(), vec1.end(), 5);
	cout << "count(vec1.begin(), vec1.end(), 5): " << cnt << endl;
}

void test02()
{
	vector<int> vec1 {1, 2, 5, 7, 25, 5, 5, 7, 33, 44};
	print_vector(vec1);
	
	// count_if举例,记录vector中大于3的元素个数
	int cnt = count_if(vec1.begin(), vec1.end(), [](int val) -> bool {return val > 3;});
	cout << "(vec1.begin(), vec1.end(), [](int val) -> bool {val > 10;}): " << cnt << endl;
}

void main()
{
	test01();
	test02();
	system("pause");
}

result:
1 2 5 7 25 5 5 7 33 44
count(vec1.begin(), vec1.end(), 5): 3
1 2 5 7 25 5 5 7 33 44
(vec1.begin(), vec1.end(), [](int val) -> bool {val > 10;}): 8

💢自定义类型举例

👉 👉 👉

自定义类型在使用时,要重载==运算符。

另外,pred也需要重新实现。

cpp 复制代码
code:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class Person
{
public:
	Person(string name, int age) : m_name(name), m_age(age) {}
	bool operator==(const Person& per)
	{
		if ((per.m_name == this->m_name) && (per.m_age == this->m_age))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
public:
	string m_name;
	int m_age;
};

class Greater10
{
public:
	bool operator()(Person & per)
	{
		return per.m_age > 10;
	}
};
void print_vector(const vector<Person> &vec)
{
	for (auto i_vec : vec)
	{
		cout << "name: " << i_vec.m_name << ", age: " << i_vec.m_age  << endl;
	}
	cout << endl;
}

void test01()
{
	Person p1("张三", 10);
	Person p2("李四", 11);
	Person p3("王五", 12);
	Person p4("赵六", 10);
	Person p5("王五", 12);
	vector<Person> vec1;
	vec1.push_back(p1);
	vec1.push_back(p2);
	vec1.push_back(p3);
	vec1.push_back(p4);
	vec1.push_back(p5);
	print_vector(vec1);
	int cnt = count(vec1.begin(), vec1.end(), p5);
	cout << "王五的个数: " << cnt << endl;
	cnt = count_if(vec1.begin(), vec1.end(), Greater10());
	cout << "年龄大于10的个数: " << cnt << endl;
}

void main()
{
	test01();
	system("pause");
}

result:
name: 张三, age: 10
name: 李四, age: 11
name: 王五, age: 12
name: 赵六, age: 10
name: 王五, age: 12

王五的个数: 2
年龄大于10的个数: 3
相关推荐
To_OC2 小时前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
鱼鱼不愚与6 小时前
《原来如此 | 第01期:为什么导航软件能预测红绿灯倒计时?》
算法
博客18009 小时前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
郝学胜_神的一滴11 小时前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake
复杂网络11 小时前
论最小 Agent 计算机的形态
算法
kisshyshy1 天前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
众少成多积小致巨1 天前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
猿人谷1 天前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络1 天前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络1 天前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法