C++ 对无序的_多重映射键进行平均是更好的方法吗?
我正在我的无序多点映射中搜索一个键的get all值,它实际上是叠加一个int和一个表示nanosecs中执行时间的值。我需要获取所有值,用一个平均值替换多个键 我试过一些代码,这是最有价值的:C++ 对无序的_多重映射键进行平均是更好的方法吗?,c++,for-loop,unordered-map,chrono,unordered-multimap,C++,For Loop,Unordered Map,Chrono,Unordered Multimap,我正在我的无序多点映射中搜索一个键的get all值,它实际上是叠加一个int和一个表示nanosecs中执行时间的值。我需要获取所有值,用一个平均值替换多个键 我试过一些代码,这是最有价值的: std::无序的多地图数据; 标准时间:纳秒平均值; //*用值填充我的地图* 用于(自动配对:数据(&P){ 自动范围=数据相等范围(配对第一); 每人( 首先, 第二, [](标准::无序\u多重映射::值\u类型&x){ 平均值=平均值+x秒; } ); 平均值=平均值/数据计数(配对第一); 数
std::无序的多地图数据;
标准时间:纳秒平均值;
//*用值填充我的地图*
用于(自动配对:数据(&P){
自动范围=数据相等范围(配对第一);
每人(
首先,
第二,
[](标准::无序\u多重映射::值\u类型&x){
平均值=平均值+x秒;
}
);
平均值=平均值/数据计数(配对第一);
数据擦除(配对优先);
data.insert({pair.first,average});
}
我得到的错误error:“average”未被捕获:average=average+x.second编码>而不是使用
请注意,从范围内的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);
我不明白这个问题。为什么不在更高的范围内声明average
?问题在于,在for\u each循环中没有定义average,所以在for\u each循环中定义average。问题解决了<代码>数据。在数据上的循环中擦除:哎哟。就像错误所说的,你没有捕获平均值。将它添加到lambda的捕获列表中。我确实做了更改,并在更高的范围内进行了声明,但仍然不起作用。我尝试了此操作,但出现了很多错误,无法在所有位置编译emplace
真的总是安全的吗?我想它不会导致重新灰化,因为大小没有增加,但新元素的迭代器是否保证在从擦除返回之前排序?这很好,我在编辑后做了更改,一切都很好!!感谢you@walnut大概填写decltype(data)新数据可能更安全代码>和数据交换(新的数据)代码>afterwards@Caleth是的,那是我的建议。还允许删除擦除
并使用普通迭代器循环。根据CPPFREFERENCE,C++14是erase
,保证保留迭代器的顺序,它没有在这方面说明emplace
。
std::transform_reduce(
range.first,
range.second,
std::chrono::nanoseconds{0},
std::plus<>{},
[](auto & x) { return x.second; }
)