我使用的类中有以下成员:
std::map<std::string, std::tuple<double, double, int>> errors;
我们的想法是在一系列bin上循环,每个bin都有一个std::string名称和与之相关的3个值
当误差超过某个阈值时,我们希望将每个银行添加到映射中,并将这三个值相加。
我目前有:
std::map<std::string, std::tuple<double, double, int>> errors;
std::string binname = "BIN1";
double mean = 5.5;
double stddev = 12.3;
int count = 1;
errors.emplace(std::piecewise_construct, std::forward_as_tuple(binname),
std::forward_as_tuple(mean, stddev, count));
这对将新银行添加到列表中很有效。但当银行已经有了该银行的条目时,我需要一些东西来求和元组。比如:
if(errors.find(binname))
{
errors.find(binname).first += mean;
errors.find(binname).second += stddev;
errors.find(binname).third += 1;
}
或者类似的东西。我想我可以拉元组,单独添加每个元素,并创建一个新条目。这是最好的方法吗?我并没有百分之百地适应结构本身,但如果能保持原样,那就太好了。
在C++17中,使用结构化绑定,您可以无条件地执行:
auto& [err_mean, err_stddev, err_count] = errors[binname];
err_mean += mean;
err_stddev += stddev;
err_count += 1;
如果不存在,errors[binname]
将创建默认条目({0., 0., 0}
(。
对于c++17之前的版本,
auto& tup = errors[binname];
std::get<0>(tup) += mean;
std::get<1>(tup) += stddev;
std::get<2>(tup) += 1;