平均 unordered_multimap 键是更好的方法吗?
Is the a better way to do an average of a unordered_multimap key?
我在我的 unordered_multimap 中搜索获取一个键的所有值,它实际上堆叠了一个 int 和一个代表纳秒执行时间的值.我需要获取所有值以将多个键替换为 一个具有平均值的键。
我试了一些代码,这个实际上是最有价值的:
std::unordered_multimap<int, std::chrono::nanoseconds> data;
std::chrono::nanoseconds average;
// *filling my map with value*
for (auto & pair : data){
auto range = data.equal_range(pair.first);
for_each (
range.first,
range.second,
[](std::unordered_multimap<int, std::chrono::nanoseconds>::value_type& x){
average = average + x.second;
}
);
average = average / data.count(pair.first);
data.erase(pair.first);
data.insert({pair.first, average});
}
我得到的错误 error: 'average' is not captured : average = average + x.second;
而不是std::for_each
, use std::accumulate
。
请注意,从范围内的 std::unordered_multimap
中删除条目是未定义的行为。换个容器装更安全。
std::unordered_multimap<int, std::chrono::nanoseconds> data;
// *filling my map with value*
std::unordered_multimap<int, std::chrono::nanoseconds> new_data;
for (auto it = data.begin(); it != data.end(); ++it){
auto range = data.equal_range(it->first);
auto average = std::accumulate (
range.first,
range.second,
std::chrono::nanoseconds{0},
[](auto sum, auto & x){
return sum + x.second;
}
) / std::distance(range.first, range.second);
new_data.emplace(key, average);
}
data.swap(new_data);
或者,如果您有 C++17,std::transform_reduce
。
std::transform_reduce(
range.first,
range.second,
std::chrono::nanoseconds{0},
std::plus<>{},
[](auto & x) { return x.second; }
)
我在我的 unordered_multimap 中搜索获取一个键的所有值,它实际上堆叠了一个 int 和一个代表纳秒执行时间的值.我需要获取所有值以将多个键替换为 一个具有平均值的键。
我试了一些代码,这个实际上是最有价值的:
std::unordered_multimap<int, std::chrono::nanoseconds> data;
std::chrono::nanoseconds average;
// *filling my map with value*
for (auto & pair : data){
auto range = data.equal_range(pair.first);
for_each (
range.first,
range.second,
[](std::unordered_multimap<int, std::chrono::nanoseconds>::value_type& x){
average = average + x.second;
}
);
average = average / data.count(pair.first);
data.erase(pair.first);
data.insert({pair.first, average});
}
我得到的错误 error: 'average' is not captured : average = average + x.second;
而不是std::for_each
, use std::accumulate
。
请注意,从范围内的 std::unordered_multimap
中删除条目是未定义的行为。换个容器装更安全。
std::unordered_multimap<int, std::chrono::nanoseconds> data;
// *filling my map with value*
std::unordered_multimap<int, std::chrono::nanoseconds> new_data;
for (auto it = data.begin(); it != data.end(); ++it){
auto range = data.equal_range(it->first);
auto average = std::accumulate (
range.first,
range.second,
std::chrono::nanoseconds{0},
[](auto sum, auto & x){
return sum + x.second;
}
) / std::distance(range.first, range.second);
new_data.emplace(key, average);
}
data.swap(new_data);
或者,如果您有 C++17,std::transform_reduce
。
std::transform_reduce(
range.first,
range.second,
std::chrono::nanoseconds{0},
std::plus<>{},
[](auto & x) { return x.second; }
)