@specsoftdev live:.cid.8e17e9b93cabb607 specsoftdev@gmail.com
std::ranges::count
Актуально для C++26.

#include <algorithm>
Актуально на 2025-05-10.


Define overload #1
template<std::input_iterator I, std::sentinel_for<I> S, class Proj = std::identity, class T = std::projected_value_t<I, Proj>>
requires std::indirect_binary_predicate<ranges::equal_to, std::projected<I, Proj>, const T*>
constexpr std::iter_difference_t<I> count(I first, S last, const T& value, Proj proj = {});

Подсчитывает количество элементов в диапазоне [first, last] эквивалентных value.
Вернёт количество найденных элементов.
Example, possible implementation
Define overload #2
template<ranges::input_range R, class Proj = std::identity, class T = std::projected_value_t<ranges::iterator_t<R>, Proj>>
requires std::indirect_binary_predicate<ranges::equal_to, std::projected<ranges::iterator_t<R>, Proj>, const T*>
constexpr ranges::range_difference_t<R> count(R&& r, const T& value, Proj proj = {});

Подсчитывает количество элементов в диапазоне "r" эквивалентных value.
Вернёт количество найденных элементов.
Example, possible implementation

Сложность

Линейная - O(n).



Examples


Example 1:
#include <iostream>
#include <algorithm>

namespace range = std::ranges;

int main()
{
    auto list = {1, 2, 3, 1, 2, 3, 3};
    auto count3 = range::count(list, 3);
    auto count7 = range::count(list, 7);

    std::cout << "count3: " << count3 << std::endl;
    std::cout << "count7: " << count7 << std::endl;
    return 0;
}


count3: 3
count7: 0





Changelog

C++26
Изменены параметры шаблонов функций (#1 и #2).
В предыдущих редакциях, перегрузка #1 имела следующий шаблон функции:
template<input_iterator I, sentinel_for<I> S, class T, class Proj = identity>
requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*>
constexpr iter_difference_t<I> ranges::count(I first, S last, const T& value, Proj proj = {});

перегрузка #2:
template<input_range R, class T, class Proj = identity>
requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*>
constexpr range_difference_t<R>
ranges::count(R&& r, const T& value, Proj proj = {});

C++20
Введён в стандарт.


See also

TODO

This page was last modified on 2025-05-10