17#include <unordered_map>
73template <
typename Iterator>
77 using value_type =
typename std::iterator_traits<Iterator>::value_type;
84 std::map<value_type, std::size_t> freq_map;
85 for (
auto it = first; it != last; ++it) {
89 std::size_t total =
static_cast<std::size_t
>(std::distance(first, last));
90 double total_d =
static_cast<double>(total);
93 std::vector<frequency_entry<value_type>> entries;
94 entries.reserve(freq_map.size());
96 std::size_t cumulative = 0;
97 for (
const auto& pair : freq_map) {
98 cumulative += pair.second;
102 static_cast<double>(pair.second) / total_d,
104 static_cast<double>(cumulative) / total_d
108 return {std::move(entries), total};
124template <
typename Iterator,
typename Projection>
127 typename std::iterator_traits<Iterator>::value_type>>
129 using result_type = std::invoke_result_t<Projection,
130 typename std::iterator_traits<Iterator>::value_type>;
136 std::map<result_type, std::size_t> freq_map;
137 for (
auto it = first; it != last; ++it) {
138 ++freq_map[std::invoke(proj, *it)];
141 std::size_t total =
static_cast<std::size_t
>(std::distance(first, last));
142 double total_d =
static_cast<double>(total);
144 std::vector<frequency_entry<result_type>> entries;
145 entries.reserve(freq_map.size());
147 std::size_t cumulative = 0;
148 for (
const auto& pair : freq_map) {
149 cumulative += pair.second;
153 static_cast<double>(pair.second) / total_d,
155 static_cast<double>(cumulative) / total_d
159 return {std::move(entries), total};
177template <
typename Iterator>
179 -> std::unordered_map<typename std::iterator_traits<Iterator>::value_type, std::size_t>
181 using value_type =
typename std::iterator_traits<Iterator>::value_type;
183 std::unordered_map<value_type, std::size_t> freq;
184 for (
auto it = first; it != last; ++it) {
202template <
typename Iterator,
typename Projection>
204 -> std::unordered_map<std::invoke_result_t<Projection,
205 typename std::iterator_traits<Iterator>::value_type>, std::size_t>
207 using result_type = std::invoke_result_t<Projection,
208 typename std::iterator_traits<Iterator>::value_type>;
210 std::unordered_map<result_type, std::size_t> freq;
211 for (
auto it = first; it != last; ++it) {
212 ++freq[std::invoke(proj, *it)];
231template <
typename Iterator>
233 -> std::unordered_map<typename std::iterator_traits<Iterator>::value_type,
double>
235 using value_type =
typename std::iterator_traits<Iterator>::value_type;
237 auto n =
static_cast<std::size_t
>(std::distance(first, last));
243 double total =
static_cast<double>(n);
245 std::unordered_map<value_type, double> result;
246 result.reserve(freq.size());
247 for (
const auto& pair : freq) {
248 result[pair.first] =
static_cast<double>(pair.second) / total;
265template <
typename Iterator,
typename Projection>
267 -> std::unordered_map<std::invoke_result_t<Projection,
268 typename std::iterator_traits<Iterator>::value_type>,
double>
270 using result_type = std::invoke_result_t<Projection,
271 typename std::iterator_traits<Iterator>::value_type>;
273 auto n =
static_cast<std::size_t
>(std::distance(first, last));
279 double total =
static_cast<double>(n);
281 std::unordered_map<result_type, double> result;
282 result.reserve(freq.size());
283 for (
const auto& pair : freq) {
284 result[pair.first] =
static_cast<double>(pair.second) / total;
304template <
typename Iterator>
306 -> std::vector<std::pair<typename std::iterator_traits<Iterator>::value_type, std::size_t>>
308 using value_type =
typename std::iterator_traits<Iterator>::value_type;
315 std::map<value_type, std::size_t> freq_map;
316 for (
auto it = first; it != last; ++it) {
320 std::vector<std::pair<value_type, std::size_t>> result;
321 result.reserve(freq_map.size());
323 std::size_t cumulative = 0;
324 for (
const auto& pair : freq_map) {
325 cumulative += pair.second;
326 result.emplace_back(pair.first, cumulative);
345template <
typename Iterator,
typename Projection>
347 -> std::vector<std::pair<std::invoke_result_t<Projection,
348 typename std::iterator_traits<Iterator>::value_type>, std::size_t>>
350 using result_type = std::invoke_result_t<Projection,
351 typename std::iterator_traits<Iterator>::value_type>;
357 std::map<result_type, std::size_t> freq_map;
358 for (
auto it = first; it != last; ++it) {
359 ++freq_map[std::invoke(proj, *it)];
362 std::vector<std::pair<result_type, std::size_t>> result;
363 result.reserve(freq_map.size());
365 std::size_t cumulative = 0;
366 for (
const auto& pair : freq_map) {
367 cumulative += pair.second;
368 result.emplace_back(pair.first, cumulative);
389template <
typename Iterator>
391 -> std::vector<std::pair<typename std::iterator_traits<Iterator>::value_type,
double>>
393 using value_type =
typename std::iterator_traits<Iterator>::value_type;
395 auto n =
static_cast<std::size_t
>(std::distance(first, last));
401 double total =
static_cast<double>(n);
403 std::vector<std::pair<value_type, double>> result;
404 result.reserve(cum_freq.size());
406 for (
const auto& pair : cum_freq) {
407 result.emplace_back(pair.first,
static_cast<double>(pair.second) / total);
426template <
typename Iterator,
typename Projection>
428 -> std::vector<std::pair<std::invoke_result_t<Projection,
429 typename std::iterator_traits<Iterator>::value_type>,
double>>
431 using result_type = std::invoke_result_t<Projection,
432 typename std::iterator_traits<Iterator>::value_type>;
434 auto n =
static_cast<std::size_t
>(std::distance(first, last));
440 double total =
static_cast<double>(n);
442 std::vector<std::pair<result_type, double>> result;
443 result.reserve(cum_freq.size());
445 for (
const auto& pair : cum_freq) {
446 result.emplace_back(pair.first,
static_cast<double>(pair.second) / total);
auto cumulative_relative_frequency(Iterator first, Iterator last) -> std::vector< std::pair< typename std::iterator_traits< Iterator >::value_type, double > >
Return cumulative relative frequency (for sorted values)
auto cumulative_frequency(Iterator first, Iterator last) -> std::vector< std::pair< typename std::iterator_traits< Iterator >::value_type, std::size_t > >
Return cumulative frequency (for sorted values)
auto frequency_count(Iterator first, Iterator last) -> std::unordered_map< typename std::iterator_traits< Iterator >::value_type, std::size_t >
Return frequency for each value (unordered_map version, fast)
auto relative_frequency(Iterator first, Iterator last) -> std::unordered_map< typename std::iterator_traits< Iterator >::value_type, double >
Return relative frequency for each value.
auto frequency_table(Iterator first, Iterator last) -> frequency_table_result< typename std::iterator_traits< Iterator >::value_type >
Create frequency table (returned with sorted keys)
std::size_t cumulative_count
Cumulative frequency.
double relative_frequency
Relative frequency.
double cumulative_relative_frequency
Cumulative relative frequency.
std::size_t count
Frequency.
std::vector< frequency_entry< T > > entries
Frequency table entries.
std::size_t total_count
Total frequency.