Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对无序的_多重映射键进行平均是更好的方法吗?_C++_For Loop_Unordered Map_Chrono_Unordered Multimap - Fatal编程技术网

C++ 对无序的_多重映射键进行平均是更好的方法吗?

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秒; } ); 平均值=平均值/数据计数(配对第一); 数

我正在我的无序多点映射中搜索一个键的get all值,它实际上是叠加一个int和一个表示nanosecs中执行时间的值。我需要获取所有值,用一个平均值替换多个键

我试过一些代码,这是最有价值的:

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