#include <iostream>
#include <vector>
#include <execution>
#include<unordered_map>
#include<numeric>
#include<string>
struct log_info {
std::string page;
time_t visit_time;
std::string broswer;
};
log_info parase_log_line(std::string const& line) {
log_info info;
info.page = line;
info.broswer = line;
info.visit_time = std::clock();
return info;
}
typedef std::unordered_map<std::string, unsigned long long> visit_map_type;
visit_map_type count_visits_per_page(std::vector<std::string>const& log_lines) {
struct combine_visits {
visit_map_type operator()(visit_map_type lhs, visit_map_type rhs) const {
if (lhs.size() < rhs.size()) { std::swap(lhs, rhs); }
for (const auto& entry : rhs) {
lhs[entry.first] += entry.second;
}
return lhs;
}
visit_map_type operator()(log_info log, visit_map_type map) const {
++map[log.page];
return map;
}
visit_map_type operator()(visit_map_type map, log_info log) const {
++map[log.page];
return map;
}
visit_map_type operator()(log_info log_1, log_info log_2) const {
visit_map_type map;
++map[log_1.page]; ++map[log_2.page];
return map;
}
};
return std::transform_reduce(std::execution::par, log_lines.begin(), log_lines.end(),
visit_map_type(),
combine_visits(),
parase_log_line);
}
int main() {
std::vector<std::string> vec = { "Firefox","Google","Baidu","UC","QQ","IE","Edge",
"Firefox","Google","Baidu","UC","QQ","IE","Edge" ,"UC","QQ","IE","Edge" ,"Other" };
std::unordered_map<std::string, unsigned long long> mp = count_visits_per_page(vec);
std::cout << "Records of times are as followed:\n\n";
for (auto const& [x, y] : mp) {
std::cout << x << ": " << y << std::endl;
}
return 0;
}
06-13
141
03-14
3102
08-30
1248
09-22
375