std::count, std::count_if
Определено в заголовочном файле <algorithm>
|
||
template< class InputIt, class T > typename iterator_traits<InputIt>::difference_type |
(1) | |
template< class InputIt, class UnaryPredicate > typename iterator_traits<InputIt>::difference_type |
(2) | |
Возвращает количество элементов в диапазоне [first, last)
, удовлетворяющих определенному условию. Первый вариант подсчитывает элементы, равные value
, второй вариант подсчитывает элементы, для которых предикат p
возвращает значение true.
Содержание |
[править] Параметры
[ first, last)
|
— | два итератора задающих диапазон элементов для проверки |
value | — | искомое значение |
p | — | унарный предикат, который возвращаетtrue для соответствующих элементов. Определение функции предиката должно быть эквивалентно следующему: bool pred(const Type &a); Присутствие const & в определении не обязательно, но функция не должна модифицировать передаваемые ей объекты. |
Требования к типам | ||
-InputIt должен соответствовать требованиям InputIterator .
|
[править] Возвращаемое значение
Количество элементов, удовлетворяющих условию.
[править] Сложность
Ровно last
- first
сравнения/применений предиката.
[править] Возможная реализация
Первый вариант |
---|
template<class InputIt, class T> typename iterator_traits<InputIt>::difference_type count(InputIt first, InputIt last, const T& value) { typename iterator_traits<InputIt>::difference_type ret = 0; for (; first != last; ++first) { if (*first == value) { ret++; } } return ret; } |
Второй вариант |
template<class InputIt, class UnaryPredicate> typename iterator_traits<InputIt>::difference_type count_if(InputIt first, InputIt last, UnaryPredicate p) { typename iterator_traits<InputIt>::difference_type ret = 0; for (; first != last; ++first) { if (p(*first)) { ret++; } } return ret; } |
[править] Пример
Следующий код использует count
чтобы определить, сколько целых чисел в std::vector'е соответствует указанному значению:
#include <algorithm> #include <iostream> #include <vector> int main() { int data[] = { 1, 2, 3, 4, 4, 3, 7, 8, 9, 10 }; std::vector<int> v(data, data+10); int target1 = 3; int target2 = 5; int num_items1 = std::count(v.begin(), v.end(), target1); int num_items2 = std::count(v.begin(), v.end(), target2); std::cout << "число: " << target1 << " количество: " << num_items1 << '\n'; std::cout << "число: " << target2 << " количество: " << num_items2 << '\n'; }
Вывод:
число: 3 количество: 2 число: 5 количество: 0
В этом примере используется лямбда-выражение для подсчёта элементов, делящихся на 3:
#include <algorithm> #include <iostream> #include <vector> int main() { int data[] = { 1, 2, 3, 4, 4, 3, 7, 8, 9, 10 }; std::vector<int> v(data, data+10); int num_items1 = std::count_if(v.begin(), v.end(), [](int i) {return i % 3 == 0;}); std::cout << "количество чисел, делящихся на три: " << num_items1 << '\n'; }
Вывод:
количество чисел, делящихся на три: 3