本文主要介绍STL中count,count_if的用法
在C++编程中,有时会遇到统计类的问题,统计满足特定条件的数目,此时可以用std::count与std::count_if,他们定义在头文件<algorithm>中,使用时要include该头文件。
std::count用于统计容器中指定元素的数目,其实现如下:
template <class InputIterator, class T>
_TYPENAME iterator_traits<InputIterator>::difference_type
count (InputIterator first, InputIterator last, const T& value)
{
typename iterator_traits<InputIterator>::difference_type n = 0; //RW_BUG: fix for bts-42842
while (first != last)
if (*first++ == value) ++n;
return n;
}
std::count_if用于统计容器中符合特定条件的数目,其实现如下:
template <class InputIterator, class Predicate>
_TYPENAME iterator_traits<InputIterator>::difference_type
count_if (InputIterator first, InputIterator last, Predicate pred)
{
typename iterator_traits<InputIterator>::difference_type n = 0; //RW_BUG: fix for bts-42842
while (first != last)
if (pred(*first++)) ++n;
return n;
}
用法举例
std::vector<int> vec1 = {10,20,30,40,50,60,50,60,50};
auto cnt1 = std::count(vec1.begin(), vec1.end(),50);
auto cnt2 = std::count(vec1.begin(), vec1.end(),150);
std::cout << "count(==50): " << cnt1 << " count(==100):" << cnt2 << std::endl;
auto cnt3 = std::count_if(vec1.begin(), vec1.end(),
[&](int value){ return value > 40;});
auto cnt4 = std::count_if(vec1.begin(), vec1.end(),
[&](int value){ return value > 150;});
std::cout << "count (>40): " << cnt3 << " count(>150):" << cnt4 << std::endl;
运行结果:
count(==50): 3 count(==100):0
count (>40): 5 count(>150):0
std::count与std::count_if用法比较简单,算法复杂度为O(n),主要用于序列式容器(sequence containers, 比如vector,list,stack,queue等)。对于关联式容器(associative comtainers,比如set,map等),有更高效的查找方式,这个后续会介绍。