【并行算法】使用std::transform_reduce来合并记录

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值